2025-04-08 02:42:30 +02:00
import { Validator } from "../Validator"
import { Utils } from "../../../Utils"
import { eliCategory } from "../../../Models/RasterLayerProperties"
export default class DistanceValidator extends Validator {
private readonly docs : string = [
"#### Helper-arguments" ,
"Options are:" ,
2025-04-15 18:18:44 +02:00
[
"````json" ,
' "background": "some_background_id or category, e.g. \'map\'"' ,
' "zoom": 20 # initial zoom level of the map' ,
2025-04-08 02:42:30 +02:00
"}" ,
2025-04-15 18:18:44 +02:00
"```" ,
] . join ( "\n" ) ,
2025-04-08 02:42:30 +02:00
] . join ( "\n\n" )
constructor ( ) {
super (
"distance" ,
2025-04-15 18:18:44 +02:00
'A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `["21", "map,photo"]' ,
2025-04-08 02:42:30 +02:00
"decimal"
)
}
isValid = ( str ) = > {
const t = Number ( str )
return ! isNaN ( t )
}
validateArguments ( args : any ) : undefined | string {
if ( args === undefined ) {
return undefined
}
if ( typeof args !== "object" || Array . isArray ( args ) ) {
return "Expected an object of type `{background?: string, zoom?: number}`"
}
const optionalKeys = [ "background" , "zoom" ]
2025-04-15 18:18:44 +02:00
const keys = Object . keys ( args ) . filter ( ( k ) = > optionalKeys . indexOf ( k ) < 0 )
2025-04-08 02:42:30 +02:00
if ( keys . length > 0 ) {
2025-04-15 18:18:44 +02:00
return (
"Unknown key " + keys . join ( "; " ) + "; use " + optionalKeys . join ( "; " ) + " instead"
)
2025-04-08 02:42:30 +02:00
}
const bg = args [ "background" ]
if ( bg && eliCategory . indexOf ( bg ) < 0 ) {
2025-04-15 18:18:44 +02:00
return (
"The given background layer is not a recognized ELI-type. Perhaps you meant one of " +
2025-07-03 17:33:29 +02:00
Utils . sortedByLevenshteinDistance ( bg , eliCategory ) . slice ( 0 , 5 )
2025-04-15 18:18:44 +02:00
)
2025-04-08 02:42:30 +02:00
}
if ( typeof args [ "zoom" ] !== "number" ) {
return "zoom must be a number, got a " + typeof args [ "zoom" ]
}
if ( typeof args [ "zoom" ] !== "number" || args [ "zoom" ] <= 1 || args [ "zoom" ] > 25 ) {
return "zoom must be a number between 2 and 25, got " + args [ "zoom" ]
}
return undefined
}
}