| 
							- 
 - 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;
 
 
  |