|
-
- const {app} = require('electron');
- const fs = require('fs');
- const path = require('path');
-
- const CONF_FILE_NAME = 'saam.conf.json';
-
- const readFile = (path) => {
- return new Promise((res, rej) => {
- fs.readFile(path, 'utf8', (err, data) => {
- res((err) ? null : data);
- });
- });
- };
-
-
- let confdata = (async () => {
- let confPaths = [
- path.join(app.getPath('userData'), CONF_FILE_NAME),
- path.join(app.getPath('home'), '.saam', CONF_FILE_NAME),
- path.join(app.getAppPath(), CONF_FILE_NAME)
- ];
- for (let i=0; i < confPaths.length; i++){
- let res = await readFile(confPaths[i]);
- if (res !== null){
- try{
- return JSON.parse(res);
- } catch (e) {
- console.log("WARNING: Malformed data at ", confPaths[i]);
- }
- }
- }
- return {};
- })();
-
-
- class ConfigNode{
- constructor(parent = null, data = null, name = ""){
- this.__parent = null;
- this.__name = "";
- this.__data = confdata;
- if ((parent instanceof ConfigNode) && (typeof data === 'object') && parent.hasSection(name)){
- this.__parent = parent;
- this.__name = name;
- this.__data = data
- }
- }
-
- getRoot(){
- if (this.__parent !== null)
- return this.__parent.getRoot();
- return this;
- }
-
- getParent(){
- return this.__parent;
- }
-
- getName(fullName = false){
- if (fulleName && this.__parent !== null){
- return this.__parent.getName(true) + "." + this.__name;
- }
- return this.__name;
- }
-
- sections(){
- let keys = Object.keys(this.__data);
- let list = [];
- for (let i=0; i < keys.length; i++){
- if (typeof this.__data[keys[i]] === 'object')
- list.push(keys[i]);
- }
- return list;
- }
-
- keys(){
- let keys = Object.keys(this.__data);
- let list = [];
- for (let i=0; i < keys.length; i++){
- if (typeof this.__data[keys[i]] !== 'object')
- list.push(keys[i]);
- }
- return list;
- }
-
- hasSection(name){
- return ((name in this.__data) && (typeof this.__data[name] === 'object'));
- }
-
- getSection(name, noErrorIfExists = false){
- if (this.hasSection(name)){
- return new ConfigNode(this, this.__data[name], name);
- } else if (noErrorIfExists){
- return null;
- }
- throw new Error("No Section '" + name + "' exists.");
- }
-
- addSection(name, noErrorIfExists = false){
- if (!(name in this.__data)){
- this.__data[name] = {};
- } else if (!noErrorIfExists){
- throw new Error("Value or Section '" + name + "' already exists.");
- }
- return this;
- }
-
- removeSection(name, noErrorOnFail = false){
- if (this.hasSection(name)){
- if (Object.keys(this.__data[name]).length <= 0){
- delete this.__data[name];
- } else if (!noErrorOnFail){
- throw new Error("Section '" + name + "' is not empty. Cannot remove.");
- }
- }
- return this;
- }
-
- hasValue(name){
- return ((name in this.__data) && (typeof this.__data[name] !== 'object'));
- }
-
- getValue(name, defval = null){
- return (name in this.__data) ? this.__data[name] : defval;
- }
-
- setValue(name, value){
- if (!this.hasSection(name)){
- this.__data[name] = value;
- } else {
- throw new Error("Name '" + name + "' defined as a section. Cannot override.");
- }
- return this;
- }
-
- clearValue(name){
- if (!this.hasSection(name)){
- if (name in this.__data)
- delete this.__data[name];
- } else {
- throw new Error("Name '" + name + "' defined as a section. Cannot remove.");
- }
- return this;
- }
-
- toJSON(){
- JSON.stringify(confdata);
- }
-
- }
-
-
- module.exports = ConfigNode;
|