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
|
module Clamp
module Attribute
# Represents an option/parameter of a Clamp::Command instance.
#
class Instance
def initialize(attribute, command)
@attribute = attribute
@command = command
end
attr_reader :attribute, :command
def defined?
command.instance_variable_defined?(attribute.ivar_name)
end
# get value directly
def get
command.instance_variable_get(attribute.ivar_name)
end
# set value directly
def set(value)
command.instance_variable_set(attribute.ivar_name, value)
end
def default
command.send(attribute.default_method)
end
# default implementation of read_method
def _read
set(default) unless self.defined?
get
end
# default implementation of append_method
def _append(value)
current_values = get || []
set(current_values + [value])
end
# default implementation of write_method for multi-valued attributes
def _replace(values)
set([])
Array(values).each { |value| take(value) }
end
def read
command.send(attribute.read_method)
end
def take(value)
if attribute.multivalued?
command.send(attribute.append_method, value)
else
command.send(attribute.write_method, value)
end
end
def default_from_environment
return if self.defined?
return if attribute.environment_variable.nil?
return unless ENV.key?(attribute.environment_variable)
# Set the parameter value if it's environment variable is present
value = ENV[attribute.environment_variable]
begin
take(value)
rescue ArgumentError => e
command.send(:signal_usage_error, Clamp.message(:env_argument_error, :env => attribute.environment_variable, :message => e.message))
end
end
end
end
end
|