Module: Pigeon::Serializer

Defined in:
lib/pigeon/serializer.rb

Overview

Serializer module for handling payload serialization and validation

Defined Under Namespace

Classes: DeserializationError, SerializationError, ValidationError

Class Method Summary collapse

Class Method Details

.deserialize(json_string, symbolize_names: false) ⇒ Hash, Array

Deserialize a JSON string to a Ruby object

Parameters:

  • json_string (String)

    JSON string to deserialize

  • symbolize_names (Boolean) (defaults to: false)

    Whether to symbolize hash keys

Returns:

  • (Hash, Array)

    Deserialized Ruby object



24
25
26
27
28
29
30
31
# File 'lib/pigeon/serializer.rb', line 24

def self.deserialize(json_string, symbolize_names: false)
  return json_string unless json_string.is_a?(String)
  return {} if json_string.empty?

  ::JSON.parse(json_string, symbolize_names: symbolize_names)
rescue StandardError => e
  raise DeserializationError, "Failed to deserialize JSON: #{e.message}"
end

.serialize(payload) ⇒ String

Serialize a payload to JSON

Parameters:

  • payload (Hash, Array, String)

    Payload to serialize

Returns:

  • (String)

    Serialized JSON string



12
13
14
15
16
17
18
# File 'lib/pigeon/serializer.rb', line 12

def self.serialize(payload)
  return payload if payload.is_a?(String)

  ::JSON.generate(payload)
rescue StandardError => e
  raise SerializationError, "Failed to serialize payload: #{e.message}"
end

.validate(payload, schema) ⇒ Boolean

Validate a payload against a JSON schema

Parameters:

  • payload (Hash, Array, String)

    Payload to validate

  • schema (Hash, String)

    JSON schema to validate against

Returns:

  • (Boolean)

    Whether the payload is valid

Raises:



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/pigeon/serializer.rb', line 38

def self.validate(payload, schema)
  # Skip validation if json-schema gem is not available
  unless defined?(::JSON::Validator)
    Pigeon.config.logger.warn("json-schema gem not available, skipping validation")
    return true
  end

  # Parse the payload if it's a string
  payload_obj = payload.is_a?(String) ? deserialize(payload) : payload

  # Parse the schema if it's a string
  schema_obj = schema.is_a?(String) ? deserialize(schema) : schema

  # Validate the payload against the schema
  ::JSON::Validator.validate!(schema_obj, payload_obj)
  true
rescue ::JSON::Schema::ValidationError => e
  raise ValidationError, "Payload validation failed: #{e.message}"
rescue StandardError => e
  raise ValidationError, "Schema validation error: #{e.message}"
end

.validate_with_registered_schema(payload, schema_name) ⇒ Boolean

Validate a payload against a registered schema

Parameters:

  • payload (Hash, Array, String)

    Payload to validate

  • schema_name (String, Symbol)

    Name of the registered schema

Returns:

  • (Boolean)

    Whether the payload is valid

Raises:



65
66
67
68
69
70
# File 'lib/pigeon/serializer.rb', line 65

def self.validate_with_registered_schema(payload, schema_name)
  schema = Pigeon.config.schemas[schema_name.to_sym]
  raise ValidationError, "Schema '#{schema_name}' not found" unless schema

  validate(payload, schema)
end