@aiot-toolkit/emulator
Version:
vela emulator tool.
111 lines (110 loc) • 3.23 kB
JavaScript
;
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;