class Nstrct::Argument
Constants
- DATATYPES
Available datatypes and their argument code
Attributes
array[R]
datatype[R]
value[R]
Public Class Methods
datatype_by_for_argument_code(code)
click to toggle source
Get the datatype of a argument code
# File lib/nstrct/argument.rb, line 23 def self.datatype_by_for_argument_code(code) DATATYPES.detect { |k, v| v == code }[0] end
new(datatype, value, array)
click to toggle source
Instantiate a new Argument
providing its datatype, value and arrayness
# File lib/nstrct/argument.rb, line 81 def initialize(datatype, value, array) @datatype, @value, @array = datatype.to_sym, value, array end
parse(data)
click to toggle source
Parse a single argument from a buffer
# File lib/nstrct/argument.rb, line 63 def self.parse(data) datatype = self.datatype_by_for_argument_code(data.slice!(0).unpack('C')[0]) if datatype == :array array_datatype = self.datatype_by_for_argument_code(data.slice!(0).unpack('C')[0]) array_num_elements = data.slice!(0).unpack('C')[0] values = [] array_num_elements.times do values << self.parse_value(array_datatype, data) end return self.new(array_datatype, values, true) else return self.new(datatype, self.parse_value(datatype, data), false) end end
parse_value(datatype, data)
click to toggle source
Parse a single value of a buffer
# File lib/nstrct/argument.rb, line 28 def self.parse_value(datatype, data) case datatype when :boolean return data.slice!(0).unpack('C')[0] == 1 when :int8 return data.slice!(0).unpack('c')[0] when :int16 return data.slice!(0..1).unpack('s>')[0] when :int32 return data.slice!(0..3).unpack('l>')[0] when :int64 return data.slice!(0..7).unpack('q>')[0] when :uint8 return data.slice!(0).unpack('C')[0] when :uint16 return data.slice!(0..1).unpack('S>')[0] when :uint32 return data.slice!(0..3).unpack('L>')[0] when :uint64 return data.slice!(0..7).unpack('Q>')[0] when :float32 return data.slice!(0..3).unpack('g')[0] when :float64 return data.slice!(0..7).unpack('G')[0] when :string length = data.slice!(0).unpack('C')[0] return length > 0 ? data.slice!(0..length - 1) : '' when :array raise 'cannot parse array value directly' else raise "datatype '#{datatype}' not recognized" end end
Public Instance Methods
inspect()
click to toggle source
Return comparable inspection
# File lib/nstrct/argument.rb, line 150 def inspect if @array "[#{@datatype.inspect}]=#{@value}" else "#{@datatype.inspect}=#{@value}" end end
pack()
click to toggle source
Pack a single argument in a buffer
# File lib/nstrct/argument.rb, line 129 def pack data = '' if @array data += [DATATYPES[:array]].pack('C') data += [DATATYPES[@datatype]].pack('C') if @value.is_a?(Array) data += [@value.size].pack('C') @value.each do |val| data = pack_value(@datatype, val, data) end else data += [0].pack('C') end else data += [DATATYPES[datatype]].pack('C') data = pack_value(@datatype, @value, data) end data end
pack_value(datatype, value, data)
click to toggle source
Pack a single value in a buffer
# File lib/nstrct/argument.rb, line 86 def pack_value(datatype, value, data) case datatype when :boolean data += [to_boolean(value) ? 1 : 0].pack('C') when :int8 data += [value.to_i].pack('c') when :int16 data += [value.to_i].pack('s>') when :int32 data += [value.to_i].pack('l>') when :int64 data += [value.to_i].pack('q>') when :uint8 data += [value.to_i].pack('C') when :uint16 data += [value.to_i].pack('S>') when :uint32 data += [value.to_i].pack('L>') when :uint64 data += [value.to_i].pack('Q>') when :float32 data += [value.to_f].pack('g') when :float64 data += [value.to_f].pack('G') when :string data += [value.to_s.size].pack('C') data += value.to_s when :array raise 'cannot pack array value directly' else raise "datatype '#{datatype}' not recognized" end data end
to_boolean(value)
click to toggle source
# File lib/nstrct/argument.rb, line 121 def to_boolean(value) return value if value.is_a?(TrueClass) || value.is_a?(FalseClass) return Integer(value) >= 1 rescue return value == 'true' end