Sha256: 482abe3297a507fd28880980feb8126f2840af6b62a122977c56569946b58b8a

Contents?: true

Size: 1.47 KB

Versions: 3

Compression:

Stored size: 1.47 KB

Contents

require 'oj'
require 'stringio'
require 'hyperion/aux/logger'
require 'abstractivator/enum'

class Hyperion
  module Formats
    # Serializes and deserializes the supported formats.
    # This is done as gracefully as possible.

    include Hyperion::Logger

    define_enum :Known, :json, :protobuf

    def write(obj, format)
      return obj if obj.is_a?(String) || obj.nil? || format.nil?

      case Formats.get_from(format)
      when :json; write_json(obj)
      when :protobuf; obj
      else; fail "Unsupported format: #{format}"
      end
    end

    def read(bytes, format)
      return nil if bytes.nil?
      return bytes if format.nil?

      case Formats.get_from(format)
      when :json; read_json(bytes)
      when :protobuf; bytes
      else; fail "Unsupported format: #{format}"
      end
    end

    def self.get_from(x)
      x.respond_to?(:format) ? x.format : x
    end

    private

    def write_json(obj)
      Oj.dump(obj, oj_options)
    end

    def read_json(bytes)
      begin
        Oj.compat_load(bytes, oj_options)
      rescue Oj::ParseError => e
        logger.error e.message
        bytes
      end
    end

    def oj_options
      {
          mode: :compat,
          time_format: :xmlschema,  # xmlschema == iso8601
          use_to_json: false,
          second_precision: 3
      }
    end

    def get_oj_line_and_col(e)
      m = e.message.match(/at line (?<line>\d+), column (?<col>\d+)/)
      m ? [m[:line].to_i, m[:col].to_i] : nil
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
hyperion_http-0.1.4 lib/hyperion/formats.rb
hyperion_http-0.1.3 lib/hyperion/formats.rb
hyperion_http-0.1.2 lib/hyperion/formats.rb