Sha256: 0022afacee606593bc93812f6fe48771f8f129c1c24cd211accb85a0332b7ff0

Contents?: true

Size: 1.53 KB

Versions: 6

Compression:

Stored size: 1.53 KB

Contents

# typed: strict

module Typed
  class Serializer
    extend T::Sig
    extend T::Helpers
    extend T::Generic
    abstract!

    Input = type_member
    Output = type_member
    Params = T.type_alias { T::Hash[Symbol, T.untyped] }
    DeserializeResult = T.type_alias { Typed::Result[T::Struct, DeserializeError] }

    sig { returns(Schema) }
    attr_reader :schema

    sig { params(schema: Schema).void }
    def initialize(schema:)
      @schema = schema
    end

    sig { abstract.params(source: Output).returns(DeserializeResult) }
    def deserialize(source)
    end

    sig { abstract.params(struct: T::Struct).returns(Output) }
    def serialize(struct)
    end

    private

    sig { params(creation_params: Params).returns(DeserializeResult) }
    def deserialize_from_creation_params(creation_params)
      results = schema.fields.map do |field|
        value = creation_params[field.name]

        if value.nil?
          field.validate(value)
        elsif value.class != field.type
          coercion_result = Coercion.coerce(field: field, value: value)

          if coercion_result.success?
            field.validate(coercion_result.payload)
          else
            Failure.new(Validations::ValidationError.new(coercion_result.error.message))
          end
        else
          field.validate(value)
        end
      end

      Validations::ValidationResults
        .new(results: results)
        .combine
        .and_then do |validated_params|
          Success.new(schema.target.new(**validated_params))
        end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
sorbet-schema-0.3.0 lib/typed/serializer.rb
sorbet-schema-0.2.2 lib/typed/serializer.rb
sorbet-schema-0.2.1 lib/typed/serializer.rb
sorbet-schema-0.2.0 lib/typed/serializer.rb
sorbet-schema-0.1.1 lib/typed/serializer.rb
sorbet-schema-0.1.0 lib/typed/serializer.rb