@tricoteuses/senat
Version:
Handle French Sénat's open data
80 lines (70 loc) • 1.98 kB
text/typescript
import {
validateChain,
validateInteger,
validateNonEmptyTrimmedString,
validateNumber,
validateOption,
validateString,
validateStringToNumber,
validateTest,
} from "@biryani/core"
function validateDb(data: any): [any, any] {
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: { [key: string]: any } = {}
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: any) => 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: any): [any, any] {
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: { [key: string]: any } = {}
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]
}