Sha256: a53e3a63150e7e431e89abf257442bdd4869a565cd44cb3425c85774711f3599

Contents?: true

Size: 1.31 KB

Versions: 2

Compression:

Stored size: 1.31 KB

Contents

# frozen_string_literal: true

module RailwayIpc
  class IncomingMessage
    attr_reader :type, :message_format, :payload, :parsed_payload, :errors

    def initialize(payload, message_format: nil)
      @message_format = message_format
      @parsed_payload = JSON.parse(payload)
      @type = parsed_payload['type']
      @payload = payload
      @errors = {}
    rescue JSON::ParserError => e
      raise RailwayIpc::IncomingMessage::ParserError.new(e)
    end

    def uuid
      decoded.uuid
    end

    def user_uuid
      decoded.user_uuid
    end

    def correlation_id
      decoded.correlation_id
    end

    def valid?
      errors[:uuid] = 'uuid is required' unless uuid.present?
      errors[:correlation_id] = 'correlation_id is required' unless correlation_id.present?
      errors.none?
    end

    def decoded
      @decoded ||= \
        get_decoder(message_format).call(type, parsed_payload['encoded_message'])
    end

    def stringify_errors
      errors.values.join(', ')
    end

    private

    DEFAULT_DECODER = RailwayIpc::MessageDecoders::ProtobufBinaryDecoder

    def get_decoder(name)
      {
        'protobuf_binary' => RailwayIpc::MessageDecoders::ProtobufBinaryDecoder,
        'protobuf_json' => RailwayIpc::MessageDecoders::ProtobufJsonDecoder
      }.fetch(name, DEFAULT_DECODER)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
railway-ipc-4.0.1 lib/railway_ipc/incoming_message.rb
railway-ipc-4.0.0 lib/railway_ipc/incoming_message.rb