Sha256: 2dbcb0c627a029b945da5e62f013f90f46cfe9bce8dfa9f5cdee9b360ecb37f8

Contents?: true

Size: 1013 Bytes

Versions: 7

Compression:

Stored size: 1013 Bytes

Contents

# typed: strict

require "json"

module Typed
  class JSONSerializer < Serializer
    Input = type_member { {fixed: String} }
    Output = type_member { {fixed: String} }

    sig { override.params(source: Input).returns(Result[T::Struct, DeserializeError]) }
    def deserialize(source)
      parsed_json = JSON.parse(source)

      creation_params = schema.fields.each_with_object(T.let({}, Params)) do |field, hsh|
        hsh[field.name] = parsed_json[field.name.to_s]
      end

      deserialize_from_creation_params(creation_params)
    rescue JSON::ParserError
      Failure.new(ParseError.new(format: :json))
    end

    sig { override.params(struct: T::Struct).returns(Result[Output, SerializeError]) }
    def serialize(struct)
      return Failure.new(SerializeError.new("'#{struct.class}' cannot be serialized to target type of '#{schema.target}'.")) if struct.class != schema.target

      Success.new(JSON.generate(serialize_from_struct(struct:, should_serialize_values: true)))
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
sorbet-schema-0.9.2 lib/typed/json_serializer.rb
sorbet-schema-0.9.1 lib/typed/json_serializer.rb
sorbet-schema-0.9.0 lib/typed/json_serializer.rb
sorbet-schema-0.8.0 lib/typed/json_serializer.rb
sorbet-schema-0.7.2 lib/typed/json_serializer.rb
sorbet-schema-0.7.1 lib/typed/json_serializer.rb
sorbet-schema-0.7.0 lib/typed/json_serializer.rb