Sha256: 35ed3c086062cf779f3d2a1d96ec5fbbee4d95ae5505a5a73eddd9f797e0eb26

Contents?: true

Size: 1.34 KB

Versions: 2

Compression:

Stored size: 1.34 KB

Contents

module BERT
  class Encoder
    # Encode a Ruby object into a BERT.
    #   +ruby+ is the Ruby object
    #
    # Returns a BERT
    def self.encode(ruby)
      complex_ruby = convert(ruby)
      Erlectricity::Encoder.encode(complex_ruby)
    end

    # Convert Ruby types into corresponding Erlectricity representation
    # of BERT complex types.
    #   +item+ is the Ruby object to convert
    #
    # Returns the converted Ruby object
    def self.convert(item)
      case item
        when Hash
          pairs = Erl::List[]
          item.each_pair { |k, v| pairs << [convert(k), convert(v)] }
          [:bert, :dict, pairs]
        when Tuple
          item.map { |x| convert(x) }
        when Array
          Erl::List.new(item.map { |x| convert(x) })
        when nil
          [:bert, :nil]
        when TrueClass
          [:bert, :true]
        when FalseClass
          [:bert, :false]
        when Time
          [:bert, :time, item.to_i / 1_000_000, item.to_i % 1_000_000, item.usec]
        when Regexp
          options = Erl::List[]
          options << :caseless if item.options & Regexp::IGNORECASE > 0
          options << :extended if item.options & Regexp::EXTENDED > 0
          options << :multiline if item.options & Regexp::MULTILINE > 0
          [:bert, :regex, item.source, options]
        else
          item
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
bert-1.0.0 lib/bert/encoder.rb
bert-0.2.0 lib/bert/encoder.rb