Class: Beowulf::Type::Extension

Inherits:
Object
  • Object
show all
Includes:
ExtensionIds, ExtensionTypes, Utils
Defined in:
lib/beowulf/type/extension.rb

Constant Summary

Constants included from ExtensionTypes

ExtensionTypes::TYPES

Constants included from ExtensionIds

ExtensionIds::IDS

Instance Method Summary collapse

Methods included from Utils

#debug, #error, #extract_signatures, #hexlify, #pakArr, #pakC, #pakHash, #pakI, #pakL!, #pakPubKey, #pakQ, #pakS, #pakStr, #pakc, #pakq, #paks, #send_log, #unhexlify, #varint, #warning

Methods included from ExtensionTypes

#type

Methods included from ExtensionIds

#id

Constructor Details

#initialize(options = {}) ⇒ Extension

Returns a new instance of Extension.



10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/beowulf/type/extension.rb', line 10

def initialize(options = {})
  opt = options.dup
  @type = opt.delete(:type)

  opt.each do |k, v|
    instance_variable_set("@#{k}", type(@type, k, v))
  end

  unless Extension::known_extension_names.include? @type
    raise ExtensionError, "Unsupported extension type: #{@type}"
  end
end

Instance Method Details

#payloadObject



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/beowulf/type/extension.rb', line 51

def payload
  params = {}
  params["type"] = @type.to_s
  Extension::param_names(@type.to_sym).each do |p|
    next unless defined? p
    # puts p
    v = instance_variable_get("@#{p}")
    # puts v
    next if v.nil?
    next if v.class == Beowulf::Type::Future

    params[p] = case v
                when Beowulf::Type::ExtensionJson
                  v.to_s
                else; v
                end
  end

  params
end

#to_bytesObject



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
# File 'lib/beowulf/type/extension.rb', line 23

def to_bytes
  bytes = [id(@type.to_sym)].pack('C')

  Extension::param_names(@type.to_sym).each do |p|
    next unless defined? p
    # puts p
    v = instance_variable_get("@#{p}")
    # puts v
    bytes += v.to_bytes and next if v.respond_to? :to_bytes

    bytes += case v
             when Symbol then pakStr(v.to_s)
             when String then pakStr(v)
             when Integer then paks(v)
             when TrueClass then pakC(1)
             when FalseClass then pakC(0)
             when ::Array then pakArr(v)
             when ::Hash then pakHash(v)
             when ExtensionJson then v.to_bytes
             when NilClass then next
             else
               raise ExtensionError, "Unsupported type: #{v.class}"
             end
  end

  bytes
end