"use strict"; import {Common} from "../Utils/Common.ecma.js"; import {Check} from "../Utils/Checks.ecma.js"; /** * @typedef {import("../Application/AnP.ecma.js").AnP} AnP */ /** * @class SettingsManager * @constructor * @param {!AnP} anp * @param {?(Object.|Array)} [inputs = null] * @returns {void} * @access private * @static */ export const SettingsManager = (function(){ /** * @callback simple_callback * @returns {void} */ /** * @callback continue_callback * @param {!boolean} ok * @return {boolean} */ /** * @constructs SettingsManager * @param {!AnP} anp * @param {?(Object.|Array)} [inputs = null] * @returns {void} * @access private * @static */ const SettingsManager = function(anp, inputs = null){ /** @type {!AnP} */ const self = this, /** @type {Object.} */ settings = {}, /** @type {Object.} */ secrets = {}; /** @type {boolean} */ let started = false; /** * @returns {void} * @access private */ const constructor = () => {}; /** * @param {?continue_callback} callback * @returns {boolean} * @access public */ this.update = (callback = null) => { Common.execute_array(["default_settings_files", "settings_files", "default_settings", "settings"], (key, next) => { self.add(self.get(key), true, next); }, () => { Common.execute_array(["default_secrets_files", "secrets_files", "default_secrets", "secrets"], (key, next) => { self.add_secrets(self.get(key), true, next); }, callback, true); }, true); }; /** * @param {?continue_callback} callback * @returns {boolean} * @access public */ this.reset = (callback = null) => { [settings, secrets].forEach(Common.clear_dictionary); self.update(callback); }; /** * @param {?continue_callback} callback * @returns {boolean} * @access public */ this.start = (callback = null) => { /** @type {continue_callback} */ const end = ok => Common.execute(callback, ok); if(started){ end(false); return false; }; started = true; self.update(() => end(true)); return true; }; /** * @param {?continue_callback} callback * @returns {boolean} * @access public */ this.close = (callback = null) => { /** @type {continue_callback} */ const end = ok => Common.execute(callback, ok); if(!started){ end(false); return false; }; started = false; end(true); return true; }; /** * @param {!(string|Array.)} keys * @param {?(Object.|Array)} [subinputs = null] * @param {?any} [_default = null] * @returns {any|null} * @access public */ this.get = (keys, subinputs = null, _default = null) => Common.get_value(keys, [ subinputs, inputs, secrets, settings, SettingsManager.DEFAULT_SETTINGS ], _default); /** * @param {?any} inputs * @param {!boolean} [overwrite = false] * @param {?simple_callback} [callback = null] * @return {void} * @access public */ this.add = (inputs, overwrite = false, callback = null) => { anp.files.load_json(inputs, data => { for(let subinputs of data) Object.entries(subinputs).filter(([key, _]) => ( !Check.is_mark_key(key) && (overwrite || settings[key] === undefined) )).forEach(([key, value]) => { settings[key] = value; }); Common.execute(callback); }, true); }; /** * @param {?any} inputs * @param {!boolean} [overwrite = false] * @param {?simple_callback} [callback = null] * @return {void} * @access public */ this.add_secrets = (inputs, overwrite = false, callback = null) => { anp.files.load_json(inputs, data => { for(let subinputs of data) Object.entries(subinputs).filter(([key, _]) => ( !Check.is_mark_key(key) && (overwrite || secrets[key] === undefined)) ).forEach(([key, value]) => { secrets[key] = value; }); Common.execute(callback); }, true); }; constructor(); }; /** @type {Object.} */ SettingsManager.DEFAULT_SETTINGS = { autostart : true, default_settings_files : "/json/AnP.settings.json" }; return SettingsManager; })();