On Mon, May 11, 2020 at 04:09:32PM -0700, ToddAndMargo via perl6-users wrote:
> On 2020-05-11 11:48, Peter Pentchev wrote:
> > On Mon, May 11, 2020 at 12:40:05AM -0700, ToddAndMargo via perl6-users 
> > wrote:
> > > On 2020-05-10 23:47, Peter Pentchev wrote:
> > > > On Sun, May 10, 2020 at 06:20:02PM -0700, ToddAndMargo via perl6-users 
> > > > wrote:
> > > > > Hi All,
> > > > > 
> > > > > https://modules.raku.org/dist/Getopt::Long:cpan:LEONT
> > > > > 
> > > > > How do I handle stray entries (unknown options) without
> > > > > crashing?  Is there some grab bag I can stick all
> > > > > those into?
> > > > 
> > > > When something signals an error using "die", you can catch it
> > > > using a CATCH block, especially if you know that the exception
> > > > thrown will be of a particular type. Now, the Getopt::Long
> > > > documentation does not explicitly mention it, but the module does
> > > > indeed define its own exception type, so you can do something
> > > > like this:
> > > > 
> > > >       use v6.d;
> > > >       use Getopt::Long;
> > > >       get-options('length=i' => my $length);
> > > >       CATCH { when Getopt::Long::Exception { .message.note; exit 1 } };
> > > >       if defined $length {
> > > >               say "Whee, length is $length";
> > > >       } else {
> > > >               say 'No length specified';
> > > >       }
> > > > 
> > > > The "when" condition within the CATCH block will make it only handle
> > > > these exceptions; any other errors will be handled (or passed through) 
> > > > in
> > > > their own way.
> > > > 
> > > > For more information about exceptions, see the documentation at
> > > > https://docs.raku.org/language/exceptions
> > > > 
> > > > G'luck,
> > > > Peter
> > > > 
> > > 
> > > I was actually hope to pick up the extra entries and use them
> > > 
> > > programname.pl6 --abc def ghi
> > > 
> > > I wanted to pick up ghi and use it
> > 
> > If "ghi" is not an option or an argument to an option, then I believe
> > that Getopt::Long, like similar modules in other languages, will
> > just leave it in @ARGV.
> > 
> > > I also wanted to pick up an extra pair not on the list
> > > (unknown option) and complain about them to the user
> > 
> > Well, it seems that Getopt::Long's exceptions are not quite that
> > detailed for the moment. It could be done though, the module could
> > be touched up a little bit so that there are different exceptions
> > for different problems encountered, and some of them contained
> > additional details... but that's up to the author or to whoever
> > decides to fork and extend the module :)
> > 
> > G'luck,
> > Peter
> > 
> 
> Thank you for the words of wisdom!
> 
> I am after the functionality I see in Fedora.  For
> example
> 
>     dnf [options] <command> [<args>...]
>     $ dnf --enablerepo=* install firefox
> 
> But I will have to compromise
> 
> :-)

Compromise how? Take a look at the attached source.

G'luck,
Peter

-- 
Peter Pentchev  r...@ringlet.net r...@debian.org p...@storpool.com
PGP key:        http://people.FreeBSD.org/~roam/roam.key.asc
Key fingerprint 2EE7 A7A5 17FC 124C F115  C354 651E EFB0 2527 DF13
#!/usr/bin/env raku

use v6.d;

use Getopt::Long;

sub cmd_install($cmd, Array[Str] :$enablerepo = [], Bool :$y = False, *@rest 
--> int)
{
        say 'install';
        dd $cmd;
        dd @rest;
        dd $enablerepo;
        dd $y;
        return 0;
}

sub cmd_list($cmd, Array[Str] :$enablerepo = [], *@rest --> int)
{
        say 'list';
        dd $cmd;
        dd @rest;
        dd $enablerepo;
        return 42;
}

my %HANDLERS = (
        install => &cmd_install,
        
        # "list" doesn't care about the "-y" parameter, so skip it
        list => -> $cmd, :$enablerepo = [], :$y = False, *@rest --> int {
                cmd_list $cmd, :$enablerepo, |@rest
        },
);

sub note-fatal(Str:D $msg)
{
        $msg.note;
        exit 1;
}

{
        my $opts = get-options(
            "enablerepo=s@",
            "y",
        );
        CATCH { when Getopt::Long::Exception { .message.note; exit 1 } };
        dd $opts;

        note-fatal 'No command specified' unless $opts.elems;
        my $cmd = $opts[0];
        my $handler = %HANDLERS{$cmd};
        note-fatal "Unknown command '$cmd'" unless $handler;
        exit $handler(|$opts);
}

Attachment: signature.asc
Description: PGP signature

Reply via email to