AnP/Public/ecma/Managers/SettingsManager.ecma.js

151 lines
4.5 KiB
JavaScript

"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.<string, any|null>|Array.<any|null>)} inputs
* @returns {void}
* @access public
*/
export const SettingsManager = (function(){
/**
* @constructs SettingsManager
* @param {!AnP} anp
* @param {?(Object.<string, any|null>|Array.<any|null>)} [inputs = null]
* @returns {void}
* @access private
*/
const SettingsManager = function(anp, custom = null){
/** @type {SettingsManager} */
const self = this,
/** @type {Object.<string, any|null>} */
settings = {},
/** @type {Object.<string, any|null>} */
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.<string>)} keys
* @param {?(Object.<string, any|null>|Array.<any|null>)} [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.<string, any|null>} set
* @param {!(string|Object.<string, any|null>|Array.<any|null>)} 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.<string, any|null>|Array.<any|null>)} 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.<string, any|null>|Array.<any|null>)} 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.<string, any|null>} */
SettingsManager.DEFAULT_SETTINGS = {
"autostart" : true,
"object_name" : "anp",
"default_settings_files" : [
"/json/AnP.settings.json",
"/json/AnP.ecma.settings.json"
]
};
return SettingsManager;
})()