get default arguments to work with console command registration
This commit is contained in:
parent
7344c44576
commit
67384f30e9
@ -33,19 +33,36 @@ parse_argument_float :: (s: string) -> bool {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
command_add :: (a: int, b: int) -> int {
|
|
||||||
return a + b;
|
|
||||||
}
|
|
||||||
|
|
||||||
command_add_front :: (args: []string) {
|
|
||||||
if verify_argument_count(2,2,args.count) {
|
|
||||||
array_add(*console_report, sprint("Argument count error: count = % not in range %..%.", args.count, 2, 2));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#scope_export
|
#scope_export
|
||||||
|
|
||||||
|
string_to_bool :: (s: string) -> (bool, bool) {
|
||||||
|
if s == {
|
||||||
|
case "True"; #through;
|
||||||
|
case "TRUE"; #through;
|
||||||
|
case "1"; #through;
|
||||||
|
case "true"; #through;
|
||||||
|
case "t"; #through;
|
||||||
|
case "T";
|
||||||
|
return true, true;
|
||||||
|
case "False"; #through;
|
||||||
|
case "FALSE"; #through;
|
||||||
|
case "0"; #through;
|
||||||
|
case "false"; #through;
|
||||||
|
case "f"; #through;
|
||||||
|
case "F";
|
||||||
|
return false, true;
|
||||||
|
case;
|
||||||
|
return false, false;
|
||||||
|
}
|
||||||
|
if s == "true" || s == "TRUE" return true, true;
|
||||||
|
if s == "false" || s == "FALSE" return false, true;
|
||||||
|
return false, false;
|
||||||
|
}
|
||||||
|
|
||||||
|
add :: (a: int, b: int) -> int {
|
||||||
|
return a + b;
|
||||||
|
} @Command
|
||||||
|
|
||||||
console_command_procs : [..]([]string) -> string;
|
console_command_procs : [..]([]string) -> string;
|
||||||
console_command_names : [..]string;
|
console_command_names : [..]string;
|
||||||
|
|
||||||
@ -118,13 +135,18 @@ draw_console :: (theme: *GR.Overall_Theme) {
|
|||||||
array_add(*console_report, copy_string(tprint("> %", new)));
|
array_add(*console_report, copy_string(tprint("> %", new)));
|
||||||
state.text = console_input_start;
|
state.text = console_input_start;
|
||||||
found := false;
|
found := false;
|
||||||
|
args := split(trim(new), " ");
|
||||||
|
if args.count < 1 then return;
|
||||||
for it, idx : console_command_names {
|
for it, idx : console_command_names {
|
||||||
print("%\n", it);
|
if it == args[0] {
|
||||||
if it == new {
|
args.count -= 1;
|
||||||
array_add(*console_report, console_command_procs[idx](.[]));
|
args.data += 1;
|
||||||
|
array_add(*console_report, console_command_procs[idx](args));
|
||||||
found = true;
|
found = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// array_reset(*args);
|
||||||
if !found then array_add(*console_report, "Unknown command.");
|
if !found then array_add(*console_report, "Unknown command.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -108,8 +108,8 @@ handle_tool_click :: () {
|
|||||||
|
|
||||||
current_color : Vector3 = .{1.0, 0.0, 0.0};
|
current_color : Vector3 = .{1.0, 0.0, 0.0};
|
||||||
|
|
||||||
reset_trile :: () {
|
reset_trile :: (a: bool = false) {
|
||||||
print("Reset called!\n");
|
print("Reset called, with arg: %!\n", a);
|
||||||
} @Command
|
} @Command
|
||||||
|
|
||||||
tick_trile_editor :: () {
|
tick_trile_editor :: () {
|
||||||
|
|||||||
@ -43,14 +43,64 @@ add_console_commands :: (message: *Message, w: *Workspace) {
|
|||||||
if expression.flags & .SCOPE_FILE {
|
if expression.flags & .SCOPE_FILE {
|
||||||
compiler_report(sprint("Command % is file scoped, that is not okay. Commands must be exported.", expression.name), make_location(cast(*Code_Node)expression), .ERROR);
|
compiler_report(sprint("Command % is file scoped, that is not okay. Commands must be exported.", expression.name), make_location(cast(*Code_Node)expression), .ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @ToDo: Count argument range properly.
|
|
||||||
arg_count := header.arguments.count;
|
arg_count := header.arguments.count;
|
||||||
|
arg_count_min := header.arguments.count;
|
||||||
|
|
||||||
|
for arg, i : header.arguments {
|
||||||
|
if arg.expression != null then arg_count_min -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
builder : String_Builder;
|
builder : String_Builder;
|
||||||
print_to_builder(*builder, "%__command_front :: (args: []string) -> string {\n", expression.name);
|
print_to_builder(*builder, "%__command_front :: (args: []string) -> string {\n", expression.name);
|
||||||
print_to_builder(*builder, "if !verify_argument_count(%, %, args.count) return sprint(\"Wrong number of arguments! Expected \%, got \%.\", %, args.count);\n", arg_count, arg_count, arg_count);
|
print_to_builder(*builder, "if !verify_argument_count(%, %, args.count) return sprint(\"Wrong number of arguments! Expected \%, got \%.\", %, args.count);\n", arg_count_min, arg_count, arg_count);
|
||||||
print_to_builder(*builder, "return sprint(\"\%\", %());\n", expression.name);
|
|
||||||
|
get_call_string :: (num: int) -> string {
|
||||||
|
sep := "";
|
||||||
|
call_args_builder : String_Builder;
|
||||||
|
for 0..num-1 {
|
||||||
|
print_to_builder(*call_args_builder, "%xx a%", sep, it);
|
||||||
|
sep = ", ";
|
||||||
|
}
|
||||||
|
return builder_to_string(*call_args_builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for arg, i : header.arguments {
|
||||||
|
print("ARG% (%): %\n", i, arg.type_inst.result.type, arg.name);
|
||||||
|
type_tag := arg.type_inst.result.type;
|
||||||
|
arg_name := arg.name;
|
||||||
|
if type_tag == {
|
||||||
|
case .INTEGER;
|
||||||
|
print_to_builder(*builder, "a% : int; success% : bool;\n", i, i);
|
||||||
|
print_to_builder(*builder, "if args.count > % {\n", i);
|
||||||
|
print_to_builder(*builder, "a%, success% = string_to_int(args[%]);\n", i, i, i);
|
||||||
|
print_to_builder(*builder, "if !success% then return sprint(\"Can't parse value \% for argument % at position % to type %.\", args[%]);\n", i, arg_name, i, type_tag, i);
|
||||||
|
print_to_builder(*builder, "}\n");
|
||||||
|
case .FLOAT;
|
||||||
|
print_to_builder(*builder, "a% : float; success% : bool;\n", i, i);
|
||||||
|
print_to_builder(*builder, "if args.count > % {\n", i);
|
||||||
|
print_to_builder(*builder, "a%, success% = string_to_float(args[%]);\n", i, i, i);
|
||||||
|
print_to_builder(*builder, "if !success% then return sprint(\"Can't parse value \% for argument % at position % to type %.\", args[%]);\n", i, arg_name, i, type_tag, i);
|
||||||
|
print_to_builder(*builder, "}\n");
|
||||||
|
case .BOOL;
|
||||||
|
print_to_builder(*builder, "a% : bool; success% : bool;\n", i, i);
|
||||||
|
print_to_builder(*builder, "if args.count > % {\n", i);
|
||||||
|
print_to_builder(*builder, "a%, success% = string_to_bool(args[%]);\n", i, i, i);
|
||||||
|
print_to_builder(*builder, "if !success% then return sprint(\"Can't parse value \% for argument % at position % to type %.\", args[%]);\n", i, arg_name, i, type_tag, i);
|
||||||
|
print_to_builder(*builder, "}\n");
|
||||||
|
case .STRING;
|
||||||
|
print_to_builder(*builder, "a% : string;;\n", i);
|
||||||
|
print_to_builder(*builder, "if args.count > % {\n", i);
|
||||||
|
print_to_builder(*builder, "a% := args[%];\n", i, i);
|
||||||
|
print_to_builder(*builder, "}\n");
|
||||||
|
case;
|
||||||
|
compiler_report(sprint("Argument % is of type %, which is not handled by automatic command registration.", arg_name, type_tag), make_location(cast(*Code_Node)arg), .ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for arg_count_min..arg_count {
|
||||||
|
print_to_builder(*builder, "if args.count == % then return sprint(\"\%\", %(%));\n", it, expression.name, get_call_string(it));
|
||||||
|
}
|
||||||
print_to_builder(*builder, "}\n");
|
print_to_builder(*builder, "}\n");
|
||||||
str := builder_to_string(*builder);
|
str := builder_to_string(*builder);
|
||||||
print("%\n", str);
|
print("%\n", str);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user