1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
# $Id: optiondata.rb,v 1.1.1.1 2005/09/08 15:51:38 jdf Exp $
# $Source: /Users/jdf/projects/CVSROOT/devel/ruby/commandline/lib/commandline/optionparser/optiondata.rb,v $
#
# Author: Jim Freeze
# Copyright (c) 2005 Jim Freeze
#
# =DESCRIPTION
# A very flexible commandline parser
#
# =Revision History
# Jim.Freeze 04/01/2005 Birthday
#
#
module CommandLine
#
# Data resulting from parsing a command line (Array)
# using a particular OptionParser object
#
class OptionData
attr_reader :argv, :unknown_options, :args, :not_parsed, :cmd
class OptionDataError < StandardError; end
class UnknownOptionError < OptionDataError; end
class InvalidActionError < OptionDataError; end
# argv: Original commandline parsed
# options passed on the commandline?
# unknown options ??
# args found on commandline
# array of arguments that was not parsed -- probably because of '--'
# the command if in command mode
def initialize(argv, opts, unknown_options, args, not_parsed, cmd)
@opts = {}
opts.each { |k,v|
@opts[k] =
begin
Marshal.load(Marshal.dump(v))
rescue
v
end
}
@unknown_options = Marshal.load(Marshal.dump(unknown_options))
@not_parsed = Marshal.load(Marshal.dump(not_parsed))
@argv = Marshal.load(Marshal.dump(argv))
@args = Marshal.load(Marshal.dump(args))
@cmd = Marshal.load(Marshal.dump(cmd))
end
def [](key)
if @opts.has_key?(key)
@opts[key]
else
raise(UnknownOptionError, "Unknown option '#{key}'.")
end
end
def has_option?(key)
@opts.has_key?(key)
end
def []=(key, val)
raise(InvalidActionError, "Cannot modify existing option data: "+
"#{key.inspect} => #{val.inspect}") if @opts.has_key?(key)
@opts[key] = val
end
def to_h
Marshal.load(Marshal.dump(@opts))
end
# As a convenience, options may be accessed by their name
# without the dashes. Of course, this won't work for options
# with names like '--with-shared'. For these names, you must
# still use option_data['--with-shared']
def method_missing(sym)
k1 = "--#{sym}"
k2 = "-#{sym}"
if @opts.has_key?(k1)
@opts[k1]
elsif @opts.has_key?(k2)
@opts[k2]
else
raise UnknownOptionError, "Unknown option (--|-)#{sym}."
end
end
end#class OptionData
end#module CommandLine
|