Tomtit.git | lib/Tomtit/ | Completion.rakumod
use v6;
# this module is not meant for direct usage
# it's used for Bash completion
# perl -MTomtit::Completion -ecomplete @args
# see also resources/completion.sh
unit module Tomtit::Completion;
require Tomtit;
my %config = ::("Tomtit::" ~ '&load-conf')();
sub complete () is export {
my @args = @*ARGS;
my $mode = @args[*-1]:delete;
my $current-word = @args[*-1]:delete;
my $prev-word = @args[*-1]:delete;
my $args = @args.join(" ");
if %*ENV<TOMTIT_COMPLETE_DEBUG> {
my $fh = open "/tmp/complete.txt", :a;
$fh.say("current word: <$current-word>");
$fh.say("prev word: <$prev-word>");
$fh.say("history: <$args>");
$fh.close;
}
if $prev-word eq '--help' {
return
}
# scenarios
if $prev-word eq 'tom' and $current-word ~~ /^ '--cat' | '--edit' | '--remove' / {
my $list = scenario-list("{$*CWD}/.tom",2);
print $mode eq 'tp' ?? 'scenario_list' !! $list;
return
}
if $prev-word ~~ /^ '--cat' | '--edit' | '--remove' / or $current-word ~~ /^ '--cat' | '--edit' | '--remove' / {
my $list = scenario-list("{$*CWD}/.tom");
print $mode eq 'tp' ?? 'scenario_list' !! $list;
return
}
# profiles
if $prev-word eq 'tom' and $current-word ~~ /^ '--profile' / {
my $list = profile-list(2);
print $mode eq 'tp' ?? 'profile_list' !! $list;
return
}
if $prev-word ~~ /^ '--profile' / or $current-word ~~ /^ '--profile' / {
my $list = profile-list();
print $mode eq 'tp' ?? 'profile_list' !! $list;
return
}
# environments
if $prev-word eq 'tom' and $current-word ~~ /^ '--env-set' | '--env-edit' | '--env-cat' / {
my $list = environment-list("{$*CWD}/.tom/env",2);
print $mode eq 'tp' ?? 'env_list' !! $list;
return
}
if $prev-word ~~ /^ '--env-set' | '--env-edit' | '--env-cat' / or $current-word ~~ /^ '--env-set' | '--env-edit' | '--env-cat' / {
my $list = environment-list("{$*CWD}/.tom/env");
print $mode eq 'tp' ?? 'env_list' !! $list;
return
}
# scenarios
if $prev-word eq 'tom' && $current-word eq "UNKNOWN" {
my $list = scenario-list("{$*CWD}/.tom/");
print $mode eq 'tp' ?? 'scenario_list2' !! $list;
return;
}
# options
if $current-word ~~ /^ '-' ** 1..2 / {
my $list = options-list();
print $mode eq 'tp' ?? 'opt_list' !! $list;
return;
}
# scenarios
my $list = scenario-list("{$*CWD}/.tom/");
print $mode eq 'tp' ?? 'scenario_list' !! $list;
return;
}
sub options-list {
my $list = "--verbose --quiet -q --color --completion --clean --dump_task --help --init --list --profile --remove --doc --cat --lines --last --edit --env-cat --env-set --env-edit --env-list";
if %*ENV<TOMTIT_COMPLETE_DEBUG> {
my $fh = open "/tmp/complete.txt", :a;
$fh.say("options list triggered");
$fh.say($list);
$fh.close;
}
return $list;
}
sub profile-list ($type = 1) {
my @list = (
'ado',
'azure',
'cro',
'git',
'gitlab',
'hello',
'perl',
'raku',
'ruby',
'yaml',
'tomtit',
'code',
'go'
);
if %*ENV<TOMTIT_COMPLETE_DEBUG> {
my $fh = open "/tmp/complete.txt", :a;
$fh.say("profiles list triggered, type: $type");
$fh.say(join ' ', @list);
$fh.close;
}
if %config<profiles>:exists && %config<profiles>.^name eq 'Array' {
for %config<profiles> -> $p {
unless $p.^name eq 'Bool' {
push @list, $p;
}
}
}
return join ' ', @list;
}
sub scenario-list ($dir, $type = 1) {
my @list = Array.new;
for dir($dir) -> $f {
next unless "$f".IO ~~ :f;
next unless $f ~~ /\.raku$/;
my $scenario-name = substr($f.basename,0,($f.basename.chars)-5);
@list.push($scenario-name);
}
if %*ENV<TOMTIT_COMPLETE_DEBUG> {
my $fh = open "/tmp/complete.txt", :a;
$fh.say("scenario list triggered, type: $type");
$fh.say("{join " ", @list.sort}");
$fh.close;
}
join " ", @list.sort;
}
sub environment-list ($dir, $type = 1 ) {
my @list = Array.new;
my $current = "default";
if "$dir/current".IO ~~ :e && "$dir/current".IO.resolve.IO.basename {
if "$dir/current".IO.resolve.IO.basename ~~ /config\.(.*)\.raku/ {
$current = "$0"
}
}
for dir($dir) -> $f {
next unless "$f".IO ~~ :f;
next unless $f ~~ /\.raku$/;
if $f.basename ~~ /config\.(.*)\.raku/ {
@list.push("$0");
} else {
@list.push("default")
}
}
if %*ENV<TOMTIT_COMPLETE_DEBUG> {
my $fh = open "/tmp/complete.txt", :a;
$fh.say("environments list triggered, type: $type");
$fh.say("{join " ", @list.sort}");
$fh.close;
}
join " ", @list.sort;
}