/
ColdCore-3.0a8/
ColdCore-3.0a8/src/
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());
};