From 0a0596b14300f6726b6cdb51e350469be275536b Mon Sep 17 00:00:00 2001 From: Nathan McCarty Date: Tue, 31 Dec 2024 15:49:13 +0000 Subject: [PATCH] Project enumeration --- bin/iutils | 12 +++------ lib/IUtils.rakumod | 61 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/bin/iutils b/bin/iutils index 85452e8..b0595e5 100755 --- a/bin/iutils +++ b/bin/iutils @@ -3,12 +3,8 @@ use v6.d; use IUtils; use IUtils::Comments; -my $contents = "/home/nathan/Projects/Idris/structures/test/src/Main.idr".IO.slurp; +unit sub MAIN; -say "\nTesting full flagged-expression:"; -say $contents ~~ &flagged-expression; -when $contents ~~ &flagged-expression { - say $; - say $; - say $; -} +temp $*CWD = "/home/nathan/Projects/Idris/structures/".IO; + +say scan-packages; diff --git a/lib/IUtils.rakumod b/lib/IUtils.rakumod index 2064e2d..9c4cdf6 100644 --- a/lib/IUtils.rakumod +++ b/lib/IUtils.rakumod @@ -3,6 +3,39 @@ unit module IUtils; need IUtils::IDEMode; +use paths; + +#| Structure representing the root of what idris considers a package directory, +#| with the associated ipkg and source files. These can and will overlap within +#| the same directory. +class PackageInfo { + has IO::Path:D $.ipkg is required; + has IO::Path:D $.root is required; + has IO::Path:D @.sources is required; +} + +#| Scan a particular ipkg for its associated sources +sub scan-ipkg(IO::Path:D $ipkg --> PackageInfo:D) { + my $contents = $ipkg.slurp; + my $src-dir = + ($contents ~~ + / 'sourcedir' \h* '=' \h* + '"' $=[<-["]>*] '"' /) + // "src"; + + my IO::Path:D @sources = + paths($ipkg.parent.add($src-dir), :file(*.ends-with(".idr"))).map(*.IO); + PackageInfo.new(ipkg => $ipkg, root => $ipkg.parent, sources => @sources) +} + +#| Scan $*CWD to locate ipkgs and their associated sources +sub scan-packages(--> Array[PackageInfo:D]) is export { + my PackageInfo:D @ipkgs = + paths(:file(*.ends-with(".ipkg"))).map(*.IO.&scan-ipkg); + return @ipkgs; +} + + # Utility functions for pack #| Invoke a pack command @@ -24,17 +57,34 @@ sub pack-run(*@cmd) is export { #| Build a package with pack sub pack-build($pkg) is export { - pack-run 'build', $pkg; + pack-run 'build', $pkg } #| Test a package with pack sub pack-test($pkg) is export { - pack-run 'build', $pkg; + pack-run 'build', $pkg } #| Clean a package with pack sub pack-clean($pkg) is export { - pack-run 'clean', $pkg; + pack-run 'clean', $pkg +} + +# Utility functions for idris + +#| An error coming from the idris compiler +class IdrisError is Exception { + has Str $.out; + has Str $.err; + has Int $.exit-code; + has Str $.command; + + method message { + qq:to/END/; + Error running idris command: $.command + Command exited with $.exit-code + END + } } #| Invoke an idris command @@ -43,7 +93,10 @@ sub idris-run(*@cmd) is export { my $out = $proc.out.slurp(:close); my $err = $proc.err.slurp(:close); unless $proc { - ($out, $err) + IdrisError.new( + out => $out, err => $err, + exit-code => $proc.exitcode, command => @cmd.Str) + .throw; } return $out; }