Sha256: ce0fefc8210ee8bcf929c5ce7e57260455a74863bb9f352558792c235d316825

Contents?: true

Size: 1.29 KB

Versions: 5

Compression:

Stored size: 1.29 KB

Contents

# typed: true
# frozen_string_literal: true

return unless defined?(T::Props)

module Paquito
  # To make a T::Struct class serializable, include Paquito::TypedStruct:
  #
  #   class MyStruct < T::Struct
  #     include Paquito::TypedStruct
  #
  #     prop :foo, String
  #     prop :bar, Integer
  #   end
  #
  #   my_struct = MyStruct.new(foo: "foo", bar: 1)
  #   my_struct.as_pack
  #   => [26450, "foo", 1]
  #
  #   MyStruct.from_pack([26450, "foo", 1])
  #   => <MyStruct bar=1, foo="foo">
  #
  module TypedStruct
    extend T::Sig
    include T::Props::Plugin

    sig { returns(Array).checked(:never) }
    def as_pack
      decorator = self.class.decorator
      props = decorator.props.keys
      values = props.map { |prop| decorator.get(self, prop) }
      [self.class.pack_digest, *values]
    end

    module ClassMethods
      extend T::Sig

      sig { params(packed: Array).returns(T.untyped).checked(:never) }
      def from_pack(packed)
        digest, *values = packed
        if pack_digest != digest
          raise(VersionMismatchError, "#{self} digests do not match")
        end
        new(**props.keys.zip(values).to_h)
      end

      sig { returns(Integer).checked(:never) }
      def pack_digest
        @pack_digest ||= Paquito::Struct.digest(props.keys)
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
paquito-0.3.1 lib/paquito/typed_struct.rb
paquito-0.3.0 lib/paquito/typed_struct.rb
paquito-0.2.1 lib/paquito/typed_struct.rb
paquito-0.2.0 lib/paquito/typed_struct.rb
paquito-0.1.0 lib/paquito/typed_struct.rb