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