@tricoteuses/senat
Version:
Handle French Sénat's open data
55 lines (54 loc) • 2 kB
JavaScript
import { validateChain, validateInteger, validateNonEmptyTrimmedString, validateNumber, validateOption, validateString, validateStringToNumber, validateTest, } from "@biryani/core";
function validateDb(data) {
if (data === null || data === undefined) {
return [data, "Missing value"];
}
if (typeof data !== "object") {
return [data, `Expected an object got "${typeof data}"`];
}
data = { ...data };
const errors = {};
const remainingKeys = new Set(Object.keys(data));
for (const key of ["host", "password", "user"]) {
remainingKeys.delete(key);
const [value, error] = validateNonEmptyTrimmedString(data[key]);
data[key] = value;
if (error !== null) {
errors[key] = error;
}
}
{
const key = "port";
remainingKeys.delete(key);
const [value, error] = validateChain(validateOption([validateString, validateStringToNumber], validateNumber), validateInteger, validateTest((value) => 0 <= value && value <= 65535, "Must be an integer between 0 and 65535"))(data[key]);
data[key] = value;
if (error !== null) {
errors[key] = error;
}
}
for (const key of remainingKeys) {
errors[key] = "Unexpected item";
}
return [data, Object.keys(errors).length === 0 ? null : errors];
}
export function validateConfig(data) {
if (data === null || data === undefined) {
return [data, "Missing value"];
}
if (typeof data !== "object") {
return [data, `Expected an object got "${typeof data}"`];
}
data = { ...data };
const errors = {};
const remainingKeys = new Set(Object.keys(data));
{
const key = "db";
remainingKeys.delete(key);
const [value, error] = validateDb(data[key]);
data[key] = value;
if (error !== null) {
errors[key] = error;
}
}
return [data, Object.keys(errors).length === 0 ? null : errors];
}