diff --git a/src/Partcl/commands/dict.pm b/src/Partcl/commands/dict.pm index 3cd4634..89d70bc 100644 --- a/src/Partcl/commands/dict.pm +++ b/src/Partcl/commands/dict.pm @@ -1,49 +1,171 @@ our sub dict(*@args) { - if +@args < 1 { - error('wrong # args: should be "array option arrayName ?arg ...?"'); + Dict::dispatch_command(|@args); +} + +module Dict; + +our %Arg_limits; +our %funcs; +our %Auto_vivify; + +INIT { + + ## Negative limit in "max" position => unlimited. + %funcs := Dict::append; + %Arg_limits := [ 2, -1, "varName key ?value ...?" ]; + + %funcs := Dict::create; + %Arg_limits := [ 0, -1, "" ]; + + %funcs := Dict::exists; + %Arg_limits := [ 2, -1, "dictionary key ?key ...?" ]; + + %funcs := Dict::filter; + %Arg_limits := [ 2, -1, "dictionary filterType ..." ]; + + %funcs := Dict::for; + %Arg_limits := [ 3, 3, "\{keyVar valueVar} dictionary script" ]; + + %funcs := Dict::get; + %Arg_limits := [ 1, -1, "dictionary ?key key ...?" ]; + + %funcs := Dict::incr; + %Arg_limits := [ 2, 3, "varName key ?increment?" ]; + + %funcs := Dict::info; + %Arg_limits := [ 1, 1, "dictionary" ]; + + %funcs := Dict::keys; + %Arg_limits := [ 1, 2, "dictionary ?pattern?" ]; + + %funcs := Dict::lappend; + %Arg_limits := [ 2, -1, "varName key ?value ...?" ]; + + %funcs := Dict::merge; + %Arg_limits := [ 0, -1, "" ]; + + %funcs := Dict::remove; + %Arg_limits := [ 1, -1, "dictionary ?key ...?" ]; + + %funcs := Dict::replace; + %Arg_limits := [ 1, -1, "dictionary ?key value ...?" ]; + + %funcs := Dict::set; + %Arg_limits := [ 3, -1, "varName key ?key ...? value" ]; + + %funcs := Dict::size; + %Arg_limits := [ 1, 1, "dictionary" ]; + + %funcs := Dict::unset; + %Arg_limits := [ 2, -1, "varName key ?key ...?" ]; + + %funcs := Dict::update; + %Arg_limits := [ 4, -1, "varName key varName ?key varName ...? script" ]; + + %funcs := Dict::values; + %Arg_limits := [ 1, 2, "dictionary ?pattern?" ]; + + %funcs := Dict::with; + %Arg_limits := [ 2, -1, "dictVar ?key ...? script" ]; +} + +# Parses optional -args, and generates "wrong#args" errors +# Dispatches to fairly normal NQP subs for the detailed work. +our sub dispatch_command(*@args) { + my $num_args := +@args -1 ; # need option + + if $num_args < 0 { + error('wrong # args: should be "dict subcommand ?argument ...?"'); } - my @opts := ; - my $cmd := _tcl::select_option(@opts, @args.shift(), 'subcommand'); - - if $cmd eq 'append' { - return ''; - } elsif $cmd eq 'create' { - return ''; - } elsif $cmd eq 'filter' { - return ''; - } elsif $cmd eq 'for' { - return ''; - } elsif $cmd eq 'get' { - return ''; - } elsif $cmd eq 'incr' { - return ''; - } elsif $cmd eq 'info' { - return ''; - } elsif $cmd eq 'keys' { - return ''; - } elsif $cmd eq 'lappend' { - return ''; - } elsif $cmd eq 'merge' { - return ''; - } elsif $cmd eq 'remove' { - return ''; - } elsif $cmd eq 'replace' { - return ''; - } elsif $cmd eq 'set' { - return ''; - } elsif $cmd eq 'size' { - return ''; - } elsif $cmd eq 'unset' { - return ''; - } elsif $cmd eq 'update' { - return ''; - } elsif $cmd eq 'values' { - return ''; - } elsif $cmd eq 'with' { - return ''; + my @opts := ; + my $cmd := _tcl::select_option(@opts, @args.shift, 'subcommand'); + + my @limits := %Arg_limits{$cmd}; + + if (@limits[1] >= 0 && $num_args > @limits[1]) || $num_args < @limits[0] { + my $msg := @limits[2]; + $msg := " $msg" unless $msg eq ''; + error("wrong # args: should be \"dict $cmd$msg\"") } + + my &subcommand := %funcs{$cmd}; + &subcommand(|@args); +} + +sub append (*@args) { + ''; +} + +sub create (*@args) { + error('wrong # args: should be "dict create ?key value ...?"') + if +@args % 2; + + ''; +} + +sub filter (*@args) { + ''; +} + +sub for (*@args) { + ''; +} + +sub get (*@args) { + ''; +} + +sub incr (*@args) { + ''; +} + +sub info (*@args) { + ''; +} + +sub keys (*@args) { + ''; +} + +sub lappend (*@args) { + ''; +} + +sub merge (*@args) { + ''; +} + +sub remove (*@args) { + ''; +} + +sub replace (*@args) { + ''; +} + +sub set (*@args) { + ''; +} + +sub size (*@args) { + ''; +} + +sub unset (*@args) { + ''; +} + +sub update (*@args) { + ''; +} + +sub values (*@args) { + ''; +} + +sub with (*@args) { + ''; } # vim: expandtab shiftwidth=4 ft=perl6: