You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
3.2 KiB
123 lines
3.2 KiB
// Params:
|
|
//
|
|
// A set of convenience functions for dealing with pseudo-keyword
|
|
// arguments.
|
|
//
|
|
// Examples:
|
|
//
|
|
// A function with complex arguments
|
|
// function myFunction(params) {
|
|
// params = Params.parse(params, { myFlags: Flags.NONE,
|
|
// anInt: 42,
|
|
// aString: 'hello, world!',
|
|
// });
|
|
// ... params.anInt, params.myFlags, params.aString ...
|
|
// }
|
|
// myFunction({ anInt: -1 });
|
|
//
|
|
// Extend a method to allow more params in a subclass
|
|
// The superclass can safely use Params.parse(), it won't see
|
|
// the extensions.
|
|
// const MyClass = new Lang.Class({
|
|
// ...
|
|
// method: function(params) {
|
|
// let mine = Params.filter(params, { anInt: 42 });
|
|
// this.parent(params);
|
|
// ... mine.anInt ...
|
|
// }
|
|
// });
|
|
|
|
// parse:
|
|
// @params: caller-provided parameter object, or %null
|
|
// @defaults: function-provided defaults object
|
|
//
|
|
// Examines @params and fills in default values from @defaults for
|
|
// any properties in @defaults that don't appear in @params.
|
|
// This function will throw a Error if @params contains a property
|
|
// that is not recognized. Use fill() or filter() if you don't
|
|
// want that.
|
|
//
|
|
// If @params is %null, this returns the values from @defaults.
|
|
//
|
|
// Return value: a new object, containing the merged parameters from
|
|
// @params and @defaults
|
|
function parse(params, defaults) {
|
|
let ret = {}, prop;
|
|
params = params || {};
|
|
|
|
for (prop in params) {
|
|
if (!(prop in defaults))
|
|
throw new Error('Unrecognized parameter "' + prop + '"');
|
|
ret[prop] = params[prop];
|
|
}
|
|
|
|
for (prop in defaults) {
|
|
if (!(prop in params))
|
|
ret[prop] = defaults[prop];
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// fill:
|
|
// @params: caller-provided parameter object, or %null
|
|
// @defaults: function-provided defaults object
|
|
//
|
|
// Examines @params and fills in default values from @defaults
|
|
// for any properties in @defaults that don't appear in @params.
|
|
//
|
|
// Differently from parse(), this function does not throw for
|
|
// unrecognized parameters.
|
|
//
|
|
// Return value: a new object, containing the merged parameters from
|
|
// @params and @defaults
|
|
function fill(params, defaults) {
|
|
let ret = {}, prop;
|
|
params = params || {};
|
|
|
|
for (prop in params)
|
|
ret[prop] = params[prop];
|
|
|
|
for (prop in defaults) {
|
|
if (!(prop in ret))
|
|
ret[prop] = defaults[prop];
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
// filter:
|
|
// @params: caller-provided parameter object, or %null
|
|
// @defaults: function-provided defaults object
|
|
//
|
|
// Examines @params and returns an object containing the
|
|
// same properties as @defaults, but with values taken from
|
|
// @params where available.
|
|
// Then it removes from @params all matched properties.
|
|
//
|
|
// This is similar to parse(), but it accepts unknown properties
|
|
// and modifies @params for known ones.
|
|
//
|
|
// If @params is %null, this returns the values from @defaults.
|
|
//
|
|
// Return value: a new object, containing the merged parameters from
|
|
// @params and @defaults
|
|
function filter(params, defaults) {
|
|
let ret = {}, prop;
|
|
params = params || {};
|
|
|
|
for (prop in defaults) {
|
|
if (!(prop in params))
|
|
ret[prop] = defaults[prop];
|
|
}
|
|
|
|
for (prop in params) {
|
|
if (prop in defaults) {
|
|
ret[prop] = params[prop];
|
|
delete params[prop];
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|