diff options
| author | Paul Buetow <paul@buetow.org> | 2015-01-02 14:00:56 +0100 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2015-01-02 14:00:56 +0100 |
| commit | 4f27f3ea59baa6cfca0ac1df96b1dfedbd83706c (patch) | |
| tree | 79754e3c49216f80cb3ad5579851fca0bf1a31c9 /lib/MON/Options.pm | |
initial
Diffstat (limited to 'lib/MON/Options.pm')
| -rw-r--r-- | lib/MON/Options.pm | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/lib/MON/Options.pm b/lib/MON/Options.pm new file mode 100644 index 0000000..b798f56 --- /dev/null +++ b/lib/MON/Options.pm @@ -0,0 +1,163 @@ +package MON::Options; + +use strict; +use warnings; +use v5.10; +use autodie; + +use Data::Dumper; +use Scalar::Util qw(looks_like_number); + +use MON::Utils; + +sub new { + my ( $class, %opts ) = @_; + + my $self = bless \%opts, $class; + + $self->init(); + $self->parse(); + + return $self; +} + +sub init { + my ($self) = @_; + + my %opts = ( + opts => { + config => '', + debug => 0, + dry => 0, + help => 0, + interactive => 0, + meta => 0, + nocolor => 0, + quiet => 0, + syslog => 0, + unique => 0, + verbose => 0, + version => 0, + errfile => '', + }, + opts_short => { + c => 'config', + D => 'debug', + d => 'dry', + i => 'interactive', + h => 'help', + m => 'meta', + n => 'nocolor', + q => 'quiet', + s => 'syslog', + u => 'unique', + v => 'verbose', + V => 'version', + R => 'errfile', + }, + unknown => [], + ); + + $self->{$_} = $opts{$_} for keys %opts; + + return undef; +} + +sub parse { + my ($self) = @_; + + my $opts_passed = $self->{opts_passed}; + + for my $opt (@$opts_passed) { + my ( $k, $v ) = split /=/, $opt; + + # Longopt + if ( $k =~ s/^--// && isin $k, keys %{ $self->{opts} } ) { + if ( defined $v ) { + $self->{opts}{$k} = $v; + } + else { + $self->{opts}{$k} = 1; + } + } + + # Shortopt + elsif ( $k =~ s/^-// && isin $k, keys %{ $self->{opts_short} } ) { + if ( defined $v ) { + $self->{opts}{ $self->{opts_short}{$k} } = $v; + } + else { + $self->{opts}{ $self->{opts_short}{$k} } = 1; + } + + } + elsif ( $k !~ /\./ ) { + + # If key is not separated by dot, it is unknown + push @{ $self->{unknown} }, $opt; + + } + else { + + # Otherise it might overwrite a value of mon.conf + $self->{opts}{$k} = $v; + } + } + + # Help implies dry mode + $self->{opts}{dry} = 1 if $self->{opts}{help}; + + # Debug implies verbose mode + $self->{opts}{verbose} = 1 if $self->{opts}{debug}; + + return undef; +} + +sub get_keys { + my ($self) = @_; + my @keys; + + while ( my ( $k, $v ) = each %{ $self->{opts_short} } ) { + if ( looks_like_number( $self->{opts}{$v} ) ) { + push @keys, "--$v -$k"; + } + else { + push @keys, "--$v=VAL -$k=VAL"; + } + } + + return @keys; +} + +sub store { + my ( $self, $config ) = @_; + + $self->store_first($config); + $self->store_after($config); + + return undef; +} + +# Only store values which are not separated by dots +sub store_first { + my ( $self, $config ) = @_; + + for ( grep !/\./, keys %{ $self->{opts} } ) { + $config->{$_} = $self->{opts}{$_}; + } + + return undef; +} + +# Only store values which are separated by dots +sub store_after { + my ( $self, $config ) = @_; + + for ( grep /\./, keys %{ $self->{opts} } ) { + $config->{$_} = $self->{opts}{$_}; + } + + return undef; +} + +1; |
