"use strict"; import {Utils} from "../Utils/Utils.ecma.js"; import {Check} from "../Utils/Check.ecma.js"; /** * @typedef {import("../Application/AnP.ecma.js").AnP} AnP */ /** * @callback anp_settings_managers_default_callback * @returns {void} */ /** * @class * @constructor * @param {!AnP} anp * @param {?(Object.|Array.)} inputs * @returns {void} * @access public */ export const SettingsManager = (function(){ /** * @constructs SettingsManager * @param {!AnP} anp * @param {?(Object.|Array.)} [inputs = null] * @returns {void} * @access private */ const SettingsManager = function(anp, custom = null){ /** @type {SettingsManager} */ const self = this, /** @type {Object.} */ settings = {}, /** @type {Object.} */ secrets = {}; /** @type {boolean} */ let started = false; /** * @returns {void} * @access private */ const constructor = () => { custom = Utils.get_dictionary(custom, true); }; /** * @param {?anp_start_callback} callback * @returns {boolean} * @access public */ this.start = (callback = null) => { /** @type {!anp_start_callback} */ const end = ok => { Utils.execute(callback, ok); return ok; }; if(started) return end(false); started = true; Utils.execute_items([ "default_settings_files", "default_settings", "settings_files", "settings" ], (key, next) => { self.add(self.get(key), next, true); }, () => { Utils.execute_items([ "default_secrets_files", "default_secrets", "secrets_files", "secrets" ], (key, next) => { self.add_secrets(self.get(key), next, true); }, () => { end(true); }); }); return true; }; /** * @param {!(string|Array.)} keys * @param {?(Object.|Array.)} [inputs = null] * @param {?any} [_default = null] * @returns {any|null} * @access public */ this.get = (keys, inputs = null, _default = null) => Utils.get_value(keys, [ inputs, custom, secrets, settings, SettingsManager.DEFAULT_SETTINGS ], _default); /** * @param {!Object.} set * @param {!(string|Object.|Array.)} inputs * @param {?anp_settings_managers_default_callback} callback * @param {!boolean} overwrite * @returns {void} * @access private */ const add_to = (set, inputs, callback, overwrite) => { anp.request.load_json(inputs, (data, subcallback) => { for(const key in data) !Check.is_key_mark(key) && (overwrite || set[key] === undefined) && (set[key] = data[key]); Utils.execute(subcallback); }, callback); } /** * @param {!(string|Object.|Array.)} inputs * @param {?anp_settings_managers_default_callback} [callback = null] * @param {!boolean} [overwrite = false] * @returns {void} * @access public */ this.add = (inputs, callback = null, overwrite = false) => { add_to(settings, inputs, callback, overwrite); }; /** * @param {!(string|Object.|Array.)} inputs * @param {?anp_settings_managers_default_callback} [callback = null] * @param {!boolean} [overwrite = false] * @returns {void} * @access public */ this.add_secrets = (inputs, callback = null, overwrite = false) => { add_to(secrets, inputs, callback, overwrite); }; constructor(); }; /** @type {Object.} */ SettingsManager.DEFAULT_SETTINGS = { "autostart" : true, "object_name" : "anp", "default_settings_files" : [ "/json/AnP.settings.json", "/json/AnP.ecma.settings.json" ] }; return SettingsManager; })()