Sha256: 6869bd0b259ea0282ca30198ef2fa3054b9ad4825e6c6f6eb5e515b5593dab1e

Contents?: true

Size: 1.77 KB

Versions: 2

Compression:

Stored size: 1.77 KB

Contents

require_relative 'handler'

module MaxCube
  module Messages
    module Serializer
      include Handler

      def serialize(*args, esize: 0, size: 0, ocount: 0)
        return args.join if size.zero? && esize.zero?

        ocount, subcount, subsize = serialize_bounds(args,
                                                     esize: esize,
                                                     size: size,
                                                     ocount: ocount)
        str = ''
        args.reverse!
        ocount.times do
          str << args.pop while args.last.is_a?(String)
          substr = args.pop(subcount).pack(PACK_FORMAT[subsize])
          substr = substr[1..-1] if subsize == 3
          str << substr
        end
        str << args.pop until args.empty?

        str
      end

      def write(*args, esize: 0, size: 0, ocount: 0)
        @io.write(serialize(*args, esize: esize, size: size, ocount: ocount))
      end

      def serialize_hash_body(hash, serializer_type_str)
        method_str = "serialize_#{serializer_type_str}_#{@msg_type.downcase}"
        return send(method_str, hash) if respond_to?(method_str, true)
        raise InvalidMessageType
          .new(@msg_type, 'serialization of message type' \
                          ' is not implemented (yet)')
      end

      private

      def serialize_bounds(args, esize: 0, size: 0, ocount: 0)
        icount = args.size - args.count { |a| a.is_a?(String) }
        return 0 if icount.zero?
        if esize.zero?
          ocount = icount if ocount.zero?
          subsize = size / ocount
        else
          size = icount * esize
          ocount = size / esize
          subsize = esize
        end
        subcount = icount / ocount

        [ocount, subcount, subsize]
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
maxcube-client-0.4.1 lib/maxcube/messages/serializer.rb
maxcube-client-0.4.0 lib/maxcube/messages/serializer.rb