Skip to content

Instantly share code, notes, and snippets.

@wmantly
Created December 20, 2019 21:07
Show Gist options
  • Save wmantly/563e528514d6cc44458bdf2edf9c24c9 to your computer and use it in GitHub Desktop.
Save wmantly/563e528514d6cc44458bdf2edf9c24c9 to your computer and use it in GitHub Desktop.
'use strict';
const keys_map = {
'host': {isRequired: true, type: 'string', min: 3, max: 500},
'ip': {isRequired: true, type: 'string', min: 1, max: 500},
'username': {isRequired: true, type: 'string', min: 1, max: 500},
'updated': {default: function(){return (new Date).getTime()}},
'targetPort': {isRequired: false, default: 80, type: 'number', min: 0, max: 65535},
'forcessl': {isRequired: false, default: true, type: 'boolean'},
'targetssl': {isRequired: false, default: false, type: 'boolean'},
}
const process_type = {
number: function(key, value){
if(key.min && value < key.min) return `is to small, min ${key.min}.`
if(key.max && value > key.max) return `is to large, max ${key.max}.`
},
string: function(key, value){
if(key.min && value.length < key.min) return `is too short, min ${key.min}.`
if(key.max && value.length > key.max) return `is too short, max ${key.max}.`
}
}
function returnOrCall(value){
return typeof(value) === 'function' ? value() : value;
}
function process_keys(map, data, forceRequired){
forceRequired = forceRequired === undefined ? true : forceRequired;
let errors = [];
let out = {};
for(let key of Object.keys(map)){
// console.log(key, data[key], errors)
if(forceRequired && map[key].isRequired && !data.hasOwnProperty(key)){
errors.push({key, message:`${key} is required.`});
continue;
}
if(data.hasOwnProperty(key) && typeof(data[key]) !== map[key].type){
errors.push({key, message:`${key} is not ${map[key].type} type.`});
continue;
}
if(data.hasOwnProperty(key) && process_type[map[key].type]){
let typeError = process_type[map[key].type](map[key], data[key]);
if(typeError){
errors.push({key, message:`${key} ${typeError}`});
continue;
}
}
out[key] = data.hasOwnProperty(key) ? data[key] : returnOrCall(map[key].default);
}
if(errors.length !== 0){
return {errors}
}
return {data: out}
}
console.log('********************************************')
console.log(process_keys(keys_map, {}))
/*
{ errors:
[ { key: 'host', message: 'host is required.' },
{ key: 'ip', message: 'ip is required.' },
{ key: 'username', message: 'username is required.' } ] }
*/
console.log('********************************************')
console.log(process_keys(keys_map, {
host: 'a',
ip:'asdas',
username: '',
targetPort: 100000000
}))
/*
{ errors:
[ { key: 'host', message: 'host is too short, min 3.' },
{ key: 'username', message: 'username is too short, min 1.' },
{ key: 'targetPort',
message: 'targetPort is to large, max 65535.' } ] }
*/
console.log('********************************************')
console.log(process_keys(keys_map, {
host: 'test.com',
ip:'127.0.0.',
username: 'william',
targetPort: 443
}))
/*
{ data:
{ host: 'test.com',
ip: '127.0.0.',
username: 'william',
updated: 1576875909163,
targetPort: 443,
forcessl: true,
targetssl: false } }
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment