new object $dmi_data_ui: $user_interfaces;
var $dmi_data descriptions = #[];
var $has_commands local = \
#[["@verbal-index", [["@verbal-index", "", "@verbal-index", 'verbal_index_cmd, #[]]]], ["@dmethod", [["@dmethod", "*", "@dmethod <objref>", 'describe_method_english_cmd, #[[1, ['objref, []]]]]]],\
["@add-arg",\
[["@add-arg", "*", "@add-arg <objref: +converter +converter-args +default +name>", 'add_arg_cmd, #[[1, ['objref_opt, ["converter", "converter-args", "default", "name"]]]]]]],\
["@del-arg",\
[["@del-arg", "*", "@del-arg <objref: +name>", 'del_arg_cmd, #[[1, ['objref_opt, ["name"]]]]]]]];
var $has_commands remote = #[];
var $has_commands shortcuts = #[];
var $root created_on = 861514233;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root inited = 1;
var $root managed = [$dmi_data_ui];
var $root manager = $dmi_data_ui;
public method ._get_opt() {
arg opt, type, opts, dict;
var i, value, m;
if (!(i = opt in (opts.slice(1))))
return dict;
value = (opts[i])[4];
if (!value)
throw(~stop, ("No value for option \"" + opt) + "\".");
catch any {
switch (type) {
case 'string:
value = [value];
case 'objref:
value = (> $parse_lib.ref(value) <);
case 'symbol:
value = [(> value.to_symbol() <)];
case 'data_list:
value = (> fromliteral(value) <);
if (type(value) != 'list)
value = [value];
}
} with {
rethrow(~stop);
}
opt = opt.strip("?");
if ((m = match_pattern(opt, "*-args"))) {
opt = tosym(m[1]);
if (!dict_contains(dict, opt))
throw(~stop, ((("Arguments defined for " + opt) + " without defining ") + opt) + " method.");
value = [dict[opt], [@value]];
return dict_add(dict, opt, value);
} else {
return dict_add(dict, tosym(opt), value);
}
};
public method .add_arg_cmd() {
arg cmd, cmstr, args;
var opts, argname, argdefault, argconverter, object, method, config, objref, argconverterargs;
object = (args[1])[2];
method = tosym((args[1])[4]);
opts = args[3];
config = #[];
config = (> ._get_opt("name", 'string, opts, config) <);
config = (> ._get_opt("default", 'data_list, opts, config) <);
config = (> ._get_opt("converter", 'objref, opts, config) <);
config = (> ._get_opt("converter-args", 'data_list, opts, config) <);
argname = (| config['name] |);
if (!argname)
return "Must specify the name of the argument to add";
if (argname)
[argname] = argname;
argdefault = (| config['default] |) || [];
objref = (| config['converter] |) || [];
argconverterargs = [];
if (objref && (type(objref[1]) == 'list)) {
argconverterargs = objref[2];
objref = objref[1];
}
argconverter = [objref[2], tosym(objref[4]), argconverterargs];
(> .dmi_add_arg(object, method, argname, argdefault, argconverter) <);
return .arg_description_to_english(argname, ((object.describe_method(method))['args])[argname]);
return ("Argument, " + argname) + ", successfully added. Mail Bruce to have this give the definition of the argument.";
};
public method .arg_description_to_english() {
arg arg_name, arg_description;
var str_list, converter, default_value, converter_arg;
str_list = ["Arg: " + arg_name];
default_value = arg_description[1];
converter = arg_description[2];
if (default_value != [])
str_list += [" Default: " + toliteral(default_value[1])];
else
str_list += [" Default: None."];
if ((converter.length()) == 3)
str_list += [(((((" Converter: " + tostr(converter[1])) + ".") + tostr(converter[2])) + "( <arg value>, ") + (map converter_arg in (converter[3]) to (toliteral(converter_arg)).join(", "))) + ")"];
else
str_list += [" Converter: None."];
return str_list;
};
public method .del_arg_cmd() {
arg cmd, cmstr, args;
var opts, argname, argdefault, argconverter, object, method, config, objref, argconverterargs;
object = (args[1])[2];
method = tosym((args[1])[4]);
opts = args[3];
config = #[];
config = (> ._get_opt("name", 'string, opts, config) <);
argname = (| config['name] |);
if (!argname)
return "Must specify the name of the argument to add";
if (argname)
[argname] = argname;
(> .dmi_del_arg(object, method, argname) <);
return ("Argument, " + argname) + ", successfully deleted.";
};
public method .describe_method_english_cmd() {
arg cmdstr, cmd, args;
var i, pattern, ref, methods, s, def, method, opts, str, m, d, out, type;
(> .perms(caller(), 'command) <);
ref = args;
if ((ref[1]) == 'variable)
return ((("The reference " + (ref[3])) + ",") + ((ref[4]) || "")) + " is not for a method.";
if ((ref[1]) == 'object)
return ("The reference " + (ref[3])) + " is not for a method.";
def = (| (ref[2]).find_method(tosym(ref[4])) |);
if (def) {
pattern = ref[4];
methods = [tosym(ref[4])];
} else {
if (ref[4])
pattern = ref[4];
else
pattern = .get_setting("match-default", $programmer);
def = ref[3];
m = .get_setting("match-with", $programmer);
methods = [];
for method in (def.methods()) {
if (tostr(method).(m)(pattern))
methods += [method];
}
if (!methods)
return .tell((("No method found matching " + def) + ".") + pattern);
}
cmd = .get_setting("@program-options", $programmer);
out = [];
for method in (methods)
out += .method_description_to_english(def, method);
return out;
};
public method .dmi_add_arg() {
arg object, method, argument, default_value, converter;
var defining_object;
catch ~matchnf {
defining_object = $interface_registry.where_is(object, method);
} with {
if (object.is($page))
defining_object = object;
else
rethrow(error());
}
(> defining_object.add_data_to_method(method, 'args, argument, [default_value, converter]) <);
};
public method .dmi_del_arg() {
arg object, method, argument;
var defining_object;
defining_object = (> $interface_registry.where_is(object, method) <);
(> defining_object.del_data_from_method(method, 'args, argument) <);
};
public method .method_description_to_english() {
arg object, method;
var args, argument, argname, argorder, str_list, description;
description = (> $interface_registry.describe(object, method) <);
args = description['args];
argorder = (| description['arg_order] |) || (args.keys());
str_list = [((("Method: " + tostr(object)) + ".") + tostr(method)) + "()"];
str_list += ["Authentication: " + toliteral((| description['auth] |) || "unspecified")];
for argument in (argorder)
str_list += .arg_description_to_english(argument, args[argument]);
str_list += ["---"];
return str_list;
};
public method .set_auth() {
arg object, method, authorization_data;
var defining_object;
defining_object = (> $interface_registry.where_is(object, method) <);
(> defining_object.add_data_to_method(method, 'auth, authorization_data) <);
};
public method .verbal_index_cmd() {
arg cmdstr, cmd;
sender().tell($interface_registry.verbal_index());
};