function scriptura --description 'Manage and execute scripts' set --function valid_subcommands run help new edit which cat if not set --query --function scriptura_root_var if not set --query SCRIPTURA_ROOT; and set --query SD_ROOT set --function scriptura_root_var SD_ROOT else set --function scriptura_root_var SCRIPTURA_ROOT end end set --function SCRIPTURA_ROOT $$scriptura_root_var if test -z "$SCRIPTURA_ROOT" set --function SCRIPTURA_ROOT $HOME/sd end if not path is $SCRIPTURA_ROOT if test "$argv[1]" = new mkdir $SCRIPTURA_ROOT return 0 else echo $scriptura_root_var $SCRIPTURA_ROOT does not exist, use `$(status function) new` to create it return 1 end end if not count $argv >/dev/null echo "Usage: $(status current-command) " echo "$scriptura_root_var: $SCRIPTURA_ROOT" echo "" echo "Subcommands:" echo "" for subcommand in $valid_subcommands printf ' %-12s %s\n' $subcommand (__scriptura_describe_function __scriptura_$subcommand) end echo "" echo "Scripts:" echo "" __scriptura_list $SCRIPTURA_ROOT return 0 end set --function target $SCRIPTURA_ROOT set --function valid 0 set --function subcommand $argv[1] if contains $subcommand $valid_subcommands set --erase argv[1] else echo Invalid subcommand: $subcommand >&2 echo Expected one of: $valid_subcommands >&2 return 1 end for i in (seq (count $argv)) if test "$argv[$i]" = -- set --function valid $i break else if path is --type dir $target/$argv[$i] set --function target $target/$argv[$i] set --function seen_dir 1 set --function valid $i else if path is --type file $target/$argv[$i]; or test "$subcommand" = new set --function target $target/$argv[$i] set --function seen_script 1 set --function valid $i if not test "$subcommand" = new break end else break end end set --local remaining $argv[(math $valid + 1)..-1] switch $subcommand case run if set --query --function seen_script __scriptura_run $target $remaining return $status else if path is --type dir $target; and test (count $remaining) -eq 0; or set --query --function seen_dir __scriptura_list $target return $status end case help __scriptura_help $target return $status case new __scriptura_new $target $remaining return $status case edit __scriptura_edit $target $remaining return $status case which __scriptura_which $target $remaining return $status case cat __scriptura_cat $target $remaining return $status end echo "scriptura: don't know what to do with target \"$argv\"" >&2 return 1 end