1 'use strict'; 2 3 import { glob, basename, realpath, chdir, mkstemp } from "fs"; 4 5 export const TYPE_ARRAY = 1; 6 export const TYPE_STRING = 3; 7 export const TYPE_INT = 5; 8 export const TYPE_BOOL = 7; 9 10 export function parse_bool(val) 11 { 12 switch (val) { 13 case "1": 14 case "true": 15 return true; 16 case "0": 17 case "false": 18 return false; 19 } 20 }; 21 22 export function parse_array(val) 23 { 24 if (type(val) != "array") 25 val = split(val, /\s+/); 26 return val; 27 }; 28 29 function __type_parsers() 30 { 31 let ret = []; 32 33 ret[TYPE_ARRAY] = parse_array; 34 ret[TYPE_STRING] = function(val) { 35 return val; 36 }; 37 ret[TYPE_INT] = function(val) { 38 return +val; 39 }; 40 ret[TYPE_BOOL] = parse_bool; 41 42 return ret; 43 } 44 export const type_parser = __type_parsers(); 45 46 export function handler_load(path, cb) 47 { 48 for (let script in glob(path + "/*.sh")) { 49 script = basename(script); 50 51 let f = mkstemp(); 52 let prev_dir = realpath("."); 53 chdir(path); 54 system(`./${script} "" "dump" >&${f.fileno()}`); 55 chdir(prev_dir); 56 f.seek(); 57 while (!f.error()) { 58 let data = trim(f.read("line")); 59 try { 60 data = json(data); 61 } catch (e) { 62 continue; 63 } 64 65 if (type(data) != "object") 66 continue; 67 68 cb(script, data); 69 } 70 f.close(); 71 } 72 }; 73 74 export function handler_attributes(data, extra, validate) 75 { 76 let ret = { ...extra }; 77 for (let cur in data) { 78 let name_data = split(cur[0], ":", 2); 79 let name = name_data[0]; 80 ret[name] = cur[1]; 81 if (validate && name_data[1]) 82 validate[name] = name_data[1]; 83 } 84 return ret; 85 }; 86 87 export function parse_attribute_list(data, spec) 88 { 89 let ret = {}; 90 91 for (let name, type_id in spec) { 92 if (!(name in data)) 93 continue; 94 95 let val = data[name]; 96 let parser = type_parser[type_id]; 97 if (parser) 98 val = parser(val); 99 ret[name] = val; 100 } 101 102 return ret; 103 }; 104 105 export function is_equal(val1, val2) { 106 let t1 = type(val1); 107 108 if (t1 != type(val2)) 109 return false; 110 111 if (t1 == "array") { 112 if (length(val1) != length(val2)) 113 return false; 114 115 for (let i = 0; i < length(val1); i++) 116 if (!is_equal(val1[i], val2[i])) 117 return false; 118 119 return true; 120 } else if (t1 == "object") { 121 for (let key in val1) 122 if (!is_equal(val1[key], val2[key])) 123 return false; 124 for (let key in val2) 125 if (val1[key] == null) 126 return false; 127 return true; 128 } else { 129 return val1 == val2; 130 } 131 };
This page was automatically generated by LXR 0.3.1. • OpenWrt