Class: Solana::Ruby::Kit::Codecs::Codec

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/solana/ruby/kit/codecs/codec.rb

Overview

A Codec combines an Encoder and a Decoder for the same type. It also provides combinators that mirror @solana/codecs-core helpers:

fix_codec_size, add_codec_size_prefix, offset_codec, reverse_codec

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(encoder, decoder) ⇒ Codec

Returns a new instance of Codec.



20
21
22
23
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 20

def initialize(encoder, decoder)
  @encoder = encoder
  @decoder = decoder
end

Instance Attribute Details

#decoderObject (readonly)

Returns the value of attribute decoder.



17
18
19
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 17

def decoder
  @decoder
end

#encoderObject (readonly)

Returns the value of attribute encoder.



14
15
16
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 14

def encoder
  @encoder
end

Class Method Details

.combine(encoder, decoder) ⇒ Object



27
28
29
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 27

def self.combine(encoder, decoder)
  new(encoder, decoder)
end

Instance Method Details

#decode(bytes, offset: 0) ⇒ Object



36
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 36

def decode(bytes, offset: 0) = @decoder.decode(bytes, offset: offset)

#encode(value) ⇒ Object



33
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 33

def encode(value) = @encoder.encode(value)

#fixed_sizeObject



39
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 39

def fixed_size = @encoder.fixed_size

#transform_decoder(&map_fn) ⇒ Object



55
56
57
58
59
60
61
62
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 55

def transform_decoder(&map_fn)
  original_dec = @decoder
  new_dec = Decoder.new(fixed_size: original_dec.fixed_size) do |bytes, offset|
    value, consumed = original_dec.decode(bytes, offset: offset)
    [map_fn.call(value), consumed]
  end
  Codec.new(@encoder, new_dec)
end

#transform_encoder(&map_fn) ⇒ Object



44
45
46
47
48
49
50
# File 'lib/solana/ruby/kit/codecs/codec.rb', line 44

def transform_encoder(&map_fn)
  original_enc = @encoder
  new_enc = Encoder.new(fixed_size: original_enc.fixed_size, max_size: original_enc.max_size) do |value|
    original_enc.encode(map_fn.call(value))
  end
  Codec.new(new_enc, @decoder)
end