simplify Settings library

master
Richard de Boer 2021-11-07 17:46:19 +01:00
parent 477b2e5fdc
commit 68569cd9ba
1 changed files with 34 additions and 63 deletions

View File

@ -6,21 +6,21 @@ Usage:
// open settings for an app // open settings for an app
var appSettings = require('Settings').app(appname); var appSettings = require('Settings').app(appname);
// read a single setting // read a single setting
value = appSettings.get(path, default); value = appSettings.get(key, default);
// omit path to read all app settings // omit key to read all app settings
value = appSettings.get(); value = appSettings.get();
// write a single app setting // write a single app setting
appSettings.set(path, value) appSettings.set(key, value)
// omit path and pass an object as values to overwrite all settings for an app // omit key and pass an object as values to overwrite all settings for an app
appSettings.set(values) appSettings.set(values)
// open Bangle settings // open Bangle settings
var globalSettings = require('Settings').Bangle(); var globalSettings = require('Settings').Bangle();
value = globalSettings.get(path, default); value = globalSettings.get(key, default);
// read all global settings // read all global settings
values = globalSettings.get(); values = globalSettings.get();
// write a global setting // write a global setting
globalSettings.set(path, value) globalSettings.set(key, value)
// overwrite all global settings // overwrite all global settings
globalSettings.set(values) globalSettings.set(values)
``` ```
@ -28,20 +28,15 @@ globalSettings.set(values)
For example: For example:
``` ```
var settings = require('Settings').app('test'); var settings = require('Settings').app('test');
settings.set('foo.bar.baz', 123); // writes to 'test.settings.json' settings.set('foo', 123); // writes to 'test.settings.json'
settings.set('foo.bar.bam', 456); // updates 'test.settings.json' settings.set('bar', 456); // updates 'test.settings.json'
// 'test.settings.json' now contains {foo:{bar:{baz:123,bam:456}}} // 'test.settings.json' now contains {baz:123,bam:456}
baz = settings.get('foo.bar.baz'); // baz = 123 baz = settings.get('foo'); // baz = 123
bar = settings.get('foo.bar'); // bar = {baz: 123, bam:456} def = settings.get('jkl', 789); // def = 789
def = settings.get('asdf.jkl', 123); // def = 123 all = settings.get(); // all = {foo: 123, bar: 456}
all = settings.get(); // all = {foo: { bar: {baz: 123, bam:456} } } baz = settings.get('baz'); // baz = undefined
settings.set({fuz: 789}); // overwrites 'test.settings.json' vibrate = require('Settings').Bangle().get('vibrate', true);
// 'test.settings.json' now contains {fuz:789}
fuz = settings.get('fuz'); // fuz = 789
baz = settings.get('foo.bar.baz'); // baz = undefined
wakeOnTouch = require('Settings').Bangle().get('options.wakeOnTouch', false);
``` ```
*/ */
@ -49,63 +44,39 @@ wakeOnTouch = require('Settings').Bangle().get('options.wakeOnTouch', false);
/** /**
* *
* @param{string} file Settings file * @param{string} file Settings file
* @param path Path to setting, omit to get complete settings object * @param key Setting to get, omit to get all settings as object
* @param def Default value * @param def Default value
* @return {*} Setting * @return {*} Setting
*/ */
function get(file, path, def) { function get(file, key, def) {
let setting = require("Storage").readJSON(file); var s = require("Storage").readJSON(file);
if (def===undefined && ["object", "undefined"].includes(typeof path)) { if (def===undefined && ["object", "undefined"].includes(typeof key)) {
// get(app) or get(app, def): get all settings // get(file) or get(file, def): get all settings
def = path; return (s!==undefined) ? s : key;
path = [];
} else {
path = path.split(".");
} }
if (path.includes("")) { if (typeof s!=="object" || !(key in s)) {
throw "Settings: path cannot contain empty elements"; return def;
} }
while(path.length) { return s[key];
const key = path.shift();
if (typeof setting!=="object" || !(key in setting)) {
return def;
}
setting = setting[key];
}
return setting;
} }
/** /**
* @param {string} file Settings file * @param {string} file Settings file
* @param path Path to setting, omit to replace all settings * @param key Setting to change, omit to replace all settings
* @param value Value to store * @param value Value to store
*/ */
function set(file, path, value) { function set(file, key, value) {
if (value===undefined && typeof path==="object") { if (value===undefined && typeof key==="object") {
// set(file, value): overwrite settings completely // set(file, value): overwrite settings completely
require("Storage").writeJSON(file, path); require("Storage").writeJSON(file, key);
return; return;
} }
path = path.split("."); // empty string is not OK (becomes [""]) var s = require("Storage").readJSON(file,1);
if (path.includes("")) { if (typeof s!=="object") {
throw "Settings: path cannot contain empty elements"; s = {};
} }
let setting; s[key] = value;
try {setting = get(file);} catch(e) {} // if reading old settings failed we write a fresh object require("Storage").write(file, s);
if (typeof setting!=="object") {
setting = {};
}
let root = setting; // keep a reference to root object
const leaf = path.pop();
while(path.length) {
const key = path.shift();
if (!(key in setting) || typeof (setting[key])!=="object") {
setting[key] = {};
}
setting = setting[key];
}
setting[leaf] = value;
require("Storage").write(file, root);
} }
/** /**
@ -116,8 +87,8 @@ function set(file, path, value) {
*/ */
function open(file) { function open(file) {
return { return {
set: (path, val) => set(file, path, val), set: (key, val) => set(file, key, val),
get: (path, def) => get(file, path, def), get: (key, def) => get(file, key, def),
}; };
} }