UNPKG

@aiot-toolkit/emulator

Version:

vela emulator tool.

111 lines (110 loc) 3.23 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Status = exports.ConfigParser = void 0; let Status = exports.Status = /*#__PURE__*/function (Status) { Status[Status["NAME"] = 1] = "NAME"; Status[Status["VALUE"] = 2] = "VALUE"; Status[Status["COMMENT"] = 3] = "COMMENT"; return Status; }({}); class ConfigParser { static isEndChar(char, index, str) { return char === '\n' || index === str.length - 1; } parse(str) { let result = { comments: [], values: {} }; let currentValue = ''; let currentName = ''; let currentState = Status.NAME; const resetState = () => { currentValue = ''; currentName = ''; }; for (let i = 0; i < str.length; i++) { const char = str[i]; switch (currentState) { case Status.NAME: if (char === '#') { if (!currentName) { currentState = Status.COMMENT; } } else if (char === ' ') { if (currentName) { currentState = Status.VALUE; } } else if (ConfigParser.isEndChar(char, i, str)) { if (currentName) { throw new Error('Unexpected end of input while in NAME state'); } } else { currentName += char; } break; case Status.VALUE: if (char === '{') { let braceCount = 1; let blockContent = ''; for (let j = i + 1; j < str.length; j++) { const innerChar = str[j]; if (innerChar === '{') braceCount++; if (innerChar === '}') braceCount--; if (braceCount === 0) { blockContent = str.substring(i + 1, j); i = j; break; } blockContent += innerChar; } const parser = new ConfigParser(); const parsedResult = parser.parse(blockContent); result.values[currentName] = parsedResult; resetState(); currentState = Status.NAME; } else if (ConfigParser.isEndChar(char, i, str)) { if (char !== '\n') { currentValue += char; } result.values[currentName] = currentValue.trim(); resetState(); currentState = Status.NAME; } else { currentValue += char; } break; case Status.COMMENT: currentValue += char; if (ConfigParser.isEndChar(char, i, str)) { result.comments.push(currentValue.trim()); resetState(); currentState = Status.NAME; } break; default: throw new Error('Unknown state'); } } if (currentName) { ; result.values[currentName] = currentValue; } return result; } toObject(target) { const res = {}; for (const key in target.values) { const value = target.values[key]; if (typeof value === 'string') { res[key] = value; } else { res[key] = this.toObject(value); } } return res; } } exports.ConfigParser = ConfigParser;