import { validateArray, validateChoice, validateFunction, validateMaybeTrimmedString, validateMissing, validateNonEmptyTrimmedString, validateNumber, validateOption, validateTuple, } from "@biryani/core" import { BasemapNodeType, BasemapSourceBorder } from "../basemaps" export function validateBasemapDimension(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 remainingKeys = new Set(Object.keys(data)) const errors: { [key: string]: any } = {} { const key = "correspondences" remainingKeys.delete(key) const [value, error] = validateArray( validateTuple( validateNonEmptyTrimmedString, validateNonEmptyTrimmedString, ), )(data[key]) data[key] = value if (error !== null) { errors[key] = error } } { const key = "path" remainingKeys.delete(key) const [value, error] = validateNonEmptyTrimmedString(data[key]) data[key] = value if (error !== null) { errors[key] = error } } for (const key of remainingKeys) { errors[key] = "Unexpected entry" } return [data, Object.keys(errors).length === 0 ? null : errors] } export function validateBasemapNode(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 remainingKeys = new Set(Object.keys(data)) const errors: { [key: string]: any } = {} { const key = "description" remainingKeys.delete(key) const [value, error] = validateMaybeTrimmedString(data[key]) if (value === null) { delete data[key] } else { data[key] = value } if (error !== null) { errors[key] = error } } { const key = "name" remainingKeys.delete(key) const [value, error] = validateNonEmptyTrimmedString(data[key]) data[key] = value if (error !== null) { errors[key] = error } } { const key = "path" remainingKeys.delete(key) const [value, error] = validateNonEmptyTrimmedString(data[key]) data[key] = value if (error !== null) { errors[key] = error } } { const key = "type" remainingKeys.delete(key) const [value, error] = validateChoice([ BasemapNodeType.Basemap, BasemapNodeType.Group, ])(data[key]) data[key] = value if (error !== null) { errors[key] = error } } if (errors.type === undefined && data.type === BasemapNodeType.Basemap) { { const key = "dimensions" remainingKeys.delete(key) const [value, error] = validateArray(validateBasemapDimension)(data[key]) data[key] = value if (error !== null) { errors[key] = error } } { const key = "sources" remainingKeys.delete(key) const [value, error] = validateArray(validateBasemapSource)(data[key]) data[key] = value if (error !== null) { errors[key] = error } } } for (const key of remainingKeys) { errors[key] = "Unexpected entry" } return [data, Object.keys(errors).length === 0 ? null : errors] } export function validateBasemapSource(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 remainingKeys = new Set(Object.keys(data)) const errors: { [key: string]: any } = {} { const key = "borders" remainingKeys.delete(key) const [value, error] = validateOption(validateMissing, [ validateArray( validateChoice([ BasemapSourceBorder.Bottom, BasemapSourceBorder.Left, BasemapSourceBorder.Right, BasemapSourceBorder.Top, ]), ), validateFunction(borders => [...new Set(borders)].sort()), ])(data[key]) if (value === null) { delete data[key] } else { data[key] = value } if (error !== null) { errors[key] = error } } { const key = "projection" remainingKeys.delete(key) const [value, error] = validateMaybeTrimmedString(data[key]) if (value === null) { delete data[key] } else { data[key] = value } if (error !== null) { errors[key] = error } } { const key = "rawMapPath" remainingKeys.delete(key) const [value, error] = validateNonEmptyTrimmedString(data[key]) data[key] = value if (error !== null) { errors[key] = error } } { const key = "scale" remainingKeys.delete(key) const [value, error] = validateOption( validateMissing, validateNumber, )(data[key]) if (value === null) { delete data[key] } else { data[key] = value } if (error !== null) { errors[key] = error } } { const key = "transforms" remainingKeys.delete(key) const [value, error] = validateOption( validateMissing, validateBasemapSourceTransform, )(data[key]) if (value === null) { delete data[key] } else { data[key] = value } if (error !== null) { errors[key] = error } } { const key = "zoning" remainingKeys.delete(key) const [value, error] = validateOption( validateMissing, validateTuple( validateTuple(validateNumber, validateNumber), validateTuple(validateNumber, validateNumber), ), )(data[key]) if (value === null) { delete data[key] } else { data[key] = value } if (error !== null) { errors[key] = error } } for (const key of remainingKeys) { errors[key] = "Unexpected entry" } return [data, Object.keys(errors).length === 0 ? null : errors] } export function validateBasemapSourceTransform(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 remainingKeys = new Set(Object.keys(data)) const errors: { [key: string]: any } = {} { const key = "parallels" remainingKeys.delete(key) const [value, error] = validateOption( validateMissing, validateTuple(validateNumber, validateNumber), )(data[key]) if (value === null) { delete data[key] } else { data[key] = value } if (error !== null) { errors[key] = error } } { const key = "rotate" remainingKeys.delete(key) const [value, error] = validateOption( validateMissing, validateTuple(validateNumber, validateNumber), )(data[key]) if (value === null) { delete data[key] } else { data[key] = value } if (error !== null) { errors[key] = error } } for (const key of remainingKeys) { errors[key] = "Unexpected entry" } return [data, Object.keys(errors).length === 0 ? null : errors] }