Module: Solana::Ruby::Kit::Codecs

Extended by:
Bytes, DataStructures, Numbers, Strings, T::Sig
Defined in:
lib/solana/ruby/kit/codecs/bytes.rb,
lib/solana/ruby/kit/codecs/codec.rb,
lib/solana/ruby/kit/codecs/decoder.rb,
lib/solana/ruby/kit/codecs/encoder.rb,
lib/solana/ruby/kit/codecs/numbers.rb,
lib/solana/ruby/kit/codecs/strings.rb,
lib/solana/ruby/kit/codecs/data_structures.rb,
lib/solana/ruby/kit/codecs.rb

Defined Under Namespace

Modules: Bytes, DataStructures, Numbers, Strings Classes: Codec, Decoder, Encoder

Class Method Summary collapse

Methods included from Numbers

compact_u16_codec, f32_codec, f64_codec, i128_codec, i16_codec, i32_codec, i64_codec, i8_codec, u128_codec, u16_codec, u32_codec, u64_codec, u8_codec

Methods included from Strings

base58_codec, base64_codec, bit_array_codec, bytes_codec, hex_codec, utf8_codec

Methods included from DataStructures

array_codec, map_codec, option_codec, set_codec, struct_codec, tuple_codec, union_codec

Methods included from Bytes

contains_bytes?, fix_bytes, merge_bytes, pad_bytes

Class Method Details

.add_codec_size_prefix(codec, prefix_codec) ⇒ Object



92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 92

def add_codec_size_prefix(codec, prefix_codec)
  enc = Encoder.new do |value|
    data   = codec.encode(value)
    prefix = prefix_codec.encode(data.bytesize)
    prefix + data
  end
  dec = Decoder.new do |bytes, offset|
    len, prefix_size = prefix_codec.decode(bytes, offset: offset)
    value, data_size = codec.decode(bytes, offset: offset + prefix_size)
    [value, prefix_size + data_size]
  end
  Codec.new(enc, dec)
end

.fix_codec_size(codec, size) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 72

def fix_codec_size(codec, size)
  enc = Encoder.new(fixed_size: size) do |value|
    raw = codec.encode(value)
    if raw.bytesize < size
      raw.b + ("\x00".b * (size - raw.bytesize))
    else
      raw.b[0, size] || ''.b
    end
  end
  dec = Decoder.new(fixed_size: size) do |bytes, offset|
    slice = bytes.b.byteslice(offset, size) || ''.b
    value, = codec.decoder.decode(slice, offset: 0)
    [value, size]
  end
  Codec.new(enc, dec)
end

.offset_codec(codec, pre_offset: 0, post_offset: 0) ⇒ Object



111
112
113
114
115
116
117
118
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 111

def offset_codec(codec, pre_offset: 0, post_offset: 0)
  enc = Encoder.new(fixed_size: codec.fixed_size) { |v| codec.encode(v) }
  dec = Decoder.new(fixed_size: codec.fixed_size) do |bytes, offset|
    value, consumed = codec.decode(bytes, offset: offset + pre_offset)
    [value, consumed + post_offset]
  end
  Codec.new(enc, dec)
end

.reverse_codec(codec) ⇒ Object



122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 122

def reverse_codec(codec)
  enc = Encoder.new(fixed_size: codec.fixed_size) do |value|
    codec.encode(value).b.reverse
  end
  dec = Decoder.new(fixed_size: codec.fixed_size) do |bytes, offset|
    size    = codec.fixed_size || bytes.bytesize - offset
    slice   = bytes.b.byteslice(offset, size) || ''.b
    value, = codec.decode(slice.reverse, offset: 0)
    [value, size]
  end
  Codec.new(enc, dec)
end