Class: Arf::RPC::Metadata

Inherits:
BaseMessage show all
Defined in:
lib/arf/rpc/metadata.rb

Instance Method Summary collapse

Methods inherited from BaseMessage

#decode_bytes, #decode_string, #decode_uint16, encode, #encode_bytes, #encode_string, #encode_uint16, has_metadata, has_status, has_streaming, initialize_from, kind, message_by_kind, register

Constructor Details

#initialize(**kwargs) ⇒ Metadata



6
7
8
9
10
11
12
# File 'lib/arf/rpc/metadata.rb', line 6

def initialize(**kwargs)
  super()
  @pairs = {}
  @dirty = false
  @observer = Observer.new
  kwargs.each { |k, v| set(k, v) }
end

Instance Method Details

#[](k) ⇒ Object



20
# File 'lib/arf/rpc/metadata.rb', line 20

def [](k) = @pairs[k]

#[]=(k, v) ⇒ Object



23
24
25
# File 'lib/arf/rpc/metadata.rb', line 23

def []=(k, v)
  @observer.modify { _add(k, v) }
end

#add(k, v) ⇒ Object



18
# File 'lib/arf/rpc/metadata.rb', line 18

def add(k, v) = @observer.modify { _add(k, v) }

#attach_observer(obs) ⇒ Object



14
15
16
# File 'lib/arf/rpc/metadata.rb', line 14

def attach_observer(obs)
  @observer.attach_handler(obs)
end

#decode(data) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/arf/rpc/metadata.rb', line 89

def decode(data)
  len = decode_uint16(data)
  keys = []
  values = []

  len.times { keys << decode_string(data) }
  len.times { values << decode_bytes(data) }

  @pairs = {}
  keys.zip(values).each { |pair| _add(*pair) }
  @dirty = false

  self
end

#dirty?Boolean



67
# File 'lib/arf/rpc/metadata.rb', line 67

def dirty? = @dirty

#each(&block) ⇒ Object Also known as: each_pair



61
# File 'lib/arf/rpc/metadata.rb', line 61

def each(&block) = tap { @pairs.each(&block) }

#each_key(&block) ⇒ Object



65
# File 'lib/arf/rpc/metadata.rb', line 65

def each_key(&block) = tap { @pairs.keys(&block) }

#encodeObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/arf/rpc/metadata.rb', line 69

def encode
  pairs = []
  @pairs.each do |k, v|
    v.each { pairs << [k, _1] }
  end
  keys = IO::Buffer.new
  values = IO::Buffer.new
  pairs.each do |p|
    keys.write_raw(encode_string(p.first))
    values.write_raw(encode_bytes(p.last))
  end

  @dirty = false
  IO::Buffer.new
    .write_raw(encode_uint16(pairs.length))
    .write_raw(keys.string)
    .write_raw(values.string)
    .string
end

#get(k) ⇒ Object



21
# File 'lib/arf/rpc/metadata.rb', line 21

def get(k) = @pairs[k]&.first

#key?(k) ⇒ Boolean Also known as: has_key?



58
# File 'lib/arf/rpc/metadata.rb', line 58

def key?(k) = @pairs.key?(k.to_s)

#keysObject



64
# File 'lib/arf/rpc/metadata.rb', line 64

def keys = @pairs.keys

#merge!(other) ⇒ Object



35
36
37
38
39
40
41
42
43
44
# File 'lib/arf/rpc/metadata.rb', line 35

def merge!(other)
  @observer.modify do
    other.each do |k, v|
      @pairs[k] ||= []
      @pairs[k].append(*v)
    end
    @dirty = true
  end
  self
end

#replace!(other) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/arf/rpc/metadata.rb', line 46

def replace!(other)
  @observer.modify do
    @pairs = {}
    other.each do |k, v|
      @pairs[k] ||= []
      @pairs[k].append(*v)
    end
    @dirty = true
  end
  self
end

#set(k, v) ⇒ Object



27
28
29
30
31
32
33
# File 'lib/arf/rpc/metadata.rb', line 27

def set(k, v)
  v = [v] unless v.is_a? Array
  @observer.modify do
    @pairs[k] = []
    v.each { _add(k, _1) }
  end
end