#!/usr/bin/perl use strict; use warnings; use Carp; #use HTML::Template; $SIG{__WARN__} = sub { die @_; }; sub DisplayUsage { my $options_ref = shift; my @options = @$options_ref; print "Usage:\n"; for my $opt (@options) { my $opt_str = " " . (defined $opt->{sopt} ? "-$opt->{sopt}, " : " "); $opt_str .= (defined $opt->{lopt} ? "--$opt->{lopt}" : ""); if (lc $opt->{arg} eq "required") { $opt_str .= "="; } elsif (lc $opt->{arg} eq "optional") { $opt_str .= "[=]"; } print $opt_str . "\n " . ($opt->{desc} // "") . "\n\n"; } exit 0; } sub HandleArgs { my ($args_ref, $options_ref) = @_; my @args = @$args_ref; my @options = @$options_ref; for my $arg (@args) { if ($arg =~ m@^(-(?\w{2,})|-(?\w)|-+(?[\w-]+))(=(?.+))?\z@i) { my @soptlist; @soptlist = split //, $+{sopts} if defined $+{sopts}; my $optarg; my $handled = 1; DisplayUsage($options_ref) if ((defined $+{sopt} and $+{sopt} eq "h") or (defined $+{lopt} and $+{lopt} eq "help")); for my $opt (@options) { die "No option name to handle!" unless defined $opt->{lopt} or defined $opt->{sopt}; if (defined $opt->{sopt}) { if (grep { $_ eq $opt->{sopt} // () } @soptlist) { die "Option -$opt->{sopt} cannot be in a list as it requires an argument!\n" if $opt->{arg} eq "required"; $opt->{handler}(); } # will make these look better later elsif (defined $+{sopt} and defined $+{sopt} and $+{sopt} eq $opt->{sopt}) { $optarg = $+{optarg} // (); $opt->{handler}($optarg); } } if (defined $opt->{lopt} and defined $+{lopt} and $+{lopt} eq $opt->{lopt}) { $optarg = $+{optarg} // (); $opt->{handler}($optarg); } } die "Unrecognized option: $arg\n" unless $handled; } } } sub HandleConf { my $filename = shift; print "Loading configuration from: $filename\n"; } my @optArray = ( { lopt => "config", sopt => "c", desc => "Loads a custom config file at a specified path.", arg => "required", handler => \&HandleConf }, { lopt => "new-post", sopt => "n", desc => "Create a new post.", arg => "none", handler => sub { print "do something\n"; } }, { lopt => "build", sopt => "b", desc => "Build all posts and templates into HTML.", arg => "optional", handler => sub { print "do something\n"; } }, { lopt => "publish", sopt => "p", desc => "Publish built files.", arg => "none", handler => sub { print "do something\n"; } }, ); sub Main { HandleArgs(\@ARGV, \@optArray); } &Main(); exit 0;