Class: BinData::Choice
- Inherits:
-
Base
- Object
- Base
- BinData::Choice
- Defined in:
- lib/bindata/choice.rb,
lib/bindata/trace.rb
Overview
A Choice is a collection of data objects of which only one is active at any particular time. Method calls will be delegated to the active choice.
require 'bindata'
type1 = [:string, {value: "Type1"}]
type2 = [:string, {value: "Type2"}]
choices = {5 => type1, 17 => type2}
a = BinData::Choice.new(choices: choices, selection: 5)
a # => "Type1"
choices = [ type1, type2 ]
a = BinData::Choice.new(choices: choices, selection: 1)
a # => "Type2"
choices = [ nil, nil, nil, type1, nil, type2 ]
a = BinData::Choice.new(choices: choices, selection: 3)
a # => "Type1"
Chooser = Struct.new(:choice)
mychoice = Chooser.new
mychoice.choice = 'big'
choices = {'big' => :uint16be, 'little' => :uint16le}
a = BinData::Choice.new(choices: choices, copy_on_change: true,
selection: -> { mychoice.choice })
a.assign(256)
a.to_binary_s #=> "\001\000"
mychoice.choice = 'little'
a.to_binary_s #=> "\000\001"
Parameters
Parameters may be provided at initialisation to control the behaviour of an object. These params are:
:choices:: Either an array or a hash specifying the possible data objects. The format of the array/hash.values is a list of symbols representing the data object type. If a choice is to have params passed to it, then it should be provided as [type_symbol, hash_params]. An implementation constraint is that the hash may not contain symbols as keys, with the exception of :default. :default is to be used when then :selection does not exist in the :choices hash. :selection:: An index/key into the :choices array/hash which specifies the currently active choice. :copy_on_change:: If set to true, copy the value of the previous selection to the current selection whenever the selection changes. Default is false.
Instance Method Summary collapse
- #do_read_with_hook(io) ⇒ Object
- #initialize_instance ⇒ Object
- #initialize_shared_instance ⇒ Object
-
#method_missing(symbol, *args, **kwargs, &block) ⇒ Object
:nodoc:.
-
#respond_to?(symbol, include_all = false) ⇒ Boolean
:nodoc:.
-
#selection ⇒ Object
Returns the current selection.
Methods included from TraceHook
turn_off_tracing, turn_on_tracing
Methods included from DSLMixin
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(symbol, *args, **kwargs, &block) ⇒ Object
:nodoc:
93 94 95 |
# File 'lib/bindata/choice.rb', line 93 def method_missing(symbol, *args, **kwargs, &block) # :nodoc: current_choice.__send__(symbol, *args, **kwargs, &block) end |
Instance Method Details
#do_read_with_hook(io) ⇒ Object
79 80 81 82 83 84 85 86 |
# File 'lib/bindata/trace.rb', line 79 def do_read_with_hook(io) BinData. do |tracer| selection_string = eval_parameter(:selection).inspect tracer.trace_obj("#{debug_name}-selection-", selection_string) end do_read_without_hook(io) end |
#initialize_instance ⇒ Object
74 75 76 77 |
# File 'lib/bindata/choice.rb', line 74 def initialize_instance @choices = {} @last_selection = nil end |
#initialize_shared_instance ⇒ Object
69 70 71 72 |
# File 'lib/bindata/choice.rb', line 69 def initialize_shared_instance extend CopyOnChangePlugin if eval_parameter(:copy_on_change) == true super end |
#respond_to?(symbol, include_all = false) ⇒ Boolean
:nodoc:
89 90 91 |
# File 'lib/bindata/choice.rb', line 89 def respond_to?(symbol, include_all = false) # :nodoc: current_choice.respond_to?(symbol, include_all) || super end |
#selection ⇒ Object
Returns the current selection.
80 81 82 83 84 85 86 87 |
# File 'lib/bindata/choice.rb', line 80 def selection selection = eval_parameter(:selection) if selection.nil? raise IndexError, ":selection returned nil for #{debug_name}" end selection end |