189 lines
5.3 KiB
JavaScript
189 lines
5.3 KiB
JavaScript
"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.<string, any|null>|Array<any|null>)} [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.<string, any|null>|Array<any|null>)} [inputs = null]
|
|
* @returns {void}
|
|
* @access private
|
|
* @static
|
|
*/
|
|
const SettingsManager = function(anp, inputs = null){
|
|
|
|
/** @type {!AnP} */
|
|
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 = () => {};
|
|
|
|
/**
|
|
* @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.<string>)} keys
|
|
* @param {?(Object.<string, any|null>|Array<any|null>)} [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.<string, any|null>} */
|
|
SettingsManager.DEFAULT_SETTINGS = {
|
|
autostart : true,
|
|
default_settings_files : "/json/AnP.settings.json"
|
|
};
|
|
|
|
return SettingsManager;
|
|
})(); |