erlang-etf 1.1.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.editorconfig +20 -0
- data/.gitignore +10 -18
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +15 -4
- data/CHANGELOG.md +7 -0
- data/Gemfile +10 -6
- data/LICENSE.txt +1 -1
- data/README.md +13 -13
- data/Rakefile +8 -6
- data/erlang-etf.gemspec +10 -10
- data/lib/erlang-etf.rb +1 -0
- data/lib/erlang/etf.rb +363 -30
- data/lib/erlang/etf/atom.rb +28 -48
- data/lib/erlang/etf/atom_utf8.rb +28 -48
- data/lib/erlang/etf/binary.rb +24 -23
- data/lib/erlang/etf/bit_binary.rb +35 -27
- data/lib/erlang/etf/compressed.rb +61 -35
- data/lib/erlang/etf/export.rb +44 -21
- data/lib/erlang/etf/float.rb +33 -29
- data/lib/erlang/etf/fun.rb +54 -32
- data/lib/erlang/etf/integer.rb +24 -12
- data/lib/erlang/etf/large_big.rb +31 -37
- data/lib/erlang/etf/large_tuple.rb +41 -30
- data/lib/erlang/etf/list.rb +55 -25
- data/lib/erlang/etf/map.rb +58 -28
- data/lib/erlang/etf/new_float.rb +25 -14
- data/lib/erlang/etf/new_fun.rb +70 -47
- data/lib/erlang/etf/new_reference.rb +51 -24
- data/lib/erlang/etf/nil.rb +21 -6
- data/lib/erlang/etf/pid.rb +48 -21
- data/lib/erlang/etf/port.rb +49 -13
- data/lib/erlang/etf/reference.rb +49 -13
- data/lib/erlang/etf/small_atom.rb +31 -27
- data/lib/erlang/etf/small_atom_utf8.rb +31 -27
- data/lib/erlang/etf/small_big.rb +30 -39
- data/lib/erlang/etf/small_integer.rb +27 -12
- data/lib/erlang/etf/small_tuple.rb +41 -30
- data/lib/erlang/etf/string.rb +23 -23
- data/lib/erlang/etf/term.rb +109 -70
- data/lib/erlang/etf/version.rb +1 -1
- metadata +33 -169
- data/.rspec +0 -2
- data/lib/erlang/etf/bert.rb +0 -74
- data/lib/erlang/etf/extensions.rb +0 -144
- data/lib/erlang/etf/extensions/array.rb +0 -27
- data/lib/erlang/etf/extensions/big_decimal.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-export.rb +0 -24
- data/lib/erlang/etf/extensions/erlang-list.rb +0 -29
- data/lib/erlang/etf/extensions/erlang-map.rb +0 -26
- data/lib/erlang/etf/extensions/erlang-nil.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-pid.rb +0 -20
- data/lib/erlang/etf/extensions/erlang-string.rb +0 -31
- data/lib/erlang/etf/extensions/erlang-tuple.rb +0 -29
- data/lib/erlang/etf/extensions/false_class.rb +0 -26
- data/lib/erlang/etf/extensions/float.rb +0 -18
- data/lib/erlang/etf/extensions/hash.rb +0 -30
- data/lib/erlang/etf/extensions/integer.rb +0 -46
- data/lib/erlang/etf/extensions/nil_class.rb +0 -27
- data/lib/erlang/etf/extensions/object.rb +0 -22
- data/lib/erlang/etf/extensions/regexp.rb +0 -32
- data/lib/erlang/etf/extensions/string.rb +0 -33
- data/lib/erlang/etf/extensions/symbol.rb +0 -43
- data/lib/erlang/etf/extensions/time.rb +0 -27
- data/lib/erlang/etf/extensions/true_class.rb +0 -26
- data/lib/erlang/etf/terms.rb +0 -132
- data/spec/erlang/etf/atom_spec.rb +0 -90
- data/spec/erlang/etf/atom_utf8_spec.rb +0 -90
- data/spec/erlang/etf/binary_spec.rb +0 -90
- data/spec/erlang/etf/bit_binary_spec.rb +0 -99
- data/spec/erlang/etf/compressed_spec.rb +0 -37
- data/spec/erlang/etf/export_spec.rb +0 -58
- data/spec/erlang/etf/extensions/array_spec.rb +0 -40
- data/spec/erlang/etf/extensions/big_decimal_spec.rb +0 -26
- data/spec/erlang/etf/extensions/erlang-export_spec.rb +0 -32
- data/spec/erlang/etf/extensions/erlang-list_spec.rb +0 -76
- data/spec/erlang/etf/extensions/erlang-map_spec.rb +0 -48
- data/spec/erlang/etf/extensions/erlang-nil_spec.rb +0 -24
- data/spec/erlang/etf/extensions/erlang-pid_spec.rb +0 -33
- data/spec/erlang/etf/extensions/erlang-string_spec.rb +0 -41
- data/spec/erlang/etf/extensions/erlang-tuple_spec.rb +0 -57
- data/spec/erlang/etf/extensions/false_class_spec.rb +0 -29
- data/spec/erlang/etf/extensions/float_spec.rb +0 -24
- data/spec/erlang/etf/extensions/hash_spec.rb +0 -90
- data/spec/erlang/etf/extensions/integer_spec.rb +0 -259
- data/spec/erlang/etf/extensions/nil_class_spec.rb +0 -29
- data/spec/erlang/etf/extensions/object_spec.rb +0 -30
- data/spec/erlang/etf/extensions/regexp_spec.rb +0 -35
- data/spec/erlang/etf/extensions/string_spec.rb +0 -43
- data/spec/erlang/etf/extensions/symbol_spec.rb +0 -64
- data/spec/erlang/etf/extensions/time_spec.rb +0 -32
- data/spec/erlang/etf/extensions/true_class_spec.rb +0 -29
- data/spec/erlang/etf/float_spec.rb +0 -92
- data/spec/erlang/etf/fun_spec.rb +0 -132
- data/spec/erlang/etf/integer_spec.rb +0 -57
- data/spec/erlang/etf/large_big_spec.rb +0 -67
- data/spec/erlang/etf/large_tuple_spec.rb +0 -119
- data/spec/erlang/etf/list_spec.rb +0 -159
- data/spec/erlang/etf/map_spec.rb +0 -100
- data/spec/erlang/etf/new_float_spec.rb +0 -92
- data/spec/erlang/etf/new_fun_spec.rb +0 -146
- data/spec/erlang/etf/new_reference_spec.rb +0 -60
- data/spec/erlang/etf/nil_spec.rb +0 -50
- data/spec/erlang/etf/pid_spec.rb +0 -61
- data/spec/erlang/etf/port_spec.rb +0 -58
- data/spec/erlang/etf/reference_spec.rb +0 -58
- data/spec/erlang/etf/small_atom_spec.rb +0 -90
- data/spec/erlang/etf/small_atom_utf8_spec.rb +0 -90
- data/spec/erlang/etf/small_big_spec.rb +0 -67
- data/spec/erlang/etf/small_integer_spec.rb +0 -57
- data/spec/erlang/etf/small_tuple_spec.rb +0 -112
- data/spec/erlang/etf/string_spec.rb +0 -92
- data/spec/erlang/etf/term_spec.rb +0 -27
- data/spec/erlang/etf/terms_spec.rb +0 -23
- data/spec/erlang/etf_spec.rb +0 -23
- data/spec/erlang_spec.rb +0 -95
- data/spec/spec_helper.rb +0 -31
data/lib/erlang/etf/atom.rb
CHANGED
@@ -2,9 +2,9 @@ module Erlang
|
|
2
2
|
module ETF
|
3
3
|
|
4
4
|
#
|
5
|
-
# 1 | 2 | Len
|
6
|
-
# --- | --- | --------
|
7
|
-
# 100 | Len | AtomName
|
5
|
+
# | 1 | 2 | Len |
|
6
|
+
# | --- | --- | -------- |
|
7
|
+
# | 100 | Len | AtomName |
|
8
8
|
#
|
9
9
|
# An atom is stored with a 2 byte unsigned length in big-endian
|
10
10
|
# order, followed by `Len` numbers of 8 bit Latin1 characters that
|
@@ -17,55 +17,35 @@ module Erlang
|
|
17
17
|
# [`ATOM_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#ATOM_EXT
|
18
18
|
#
|
19
19
|
class Atom
|
20
|
-
include Term
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
20
|
+
include Erlang::ETF::Term
|
21
|
+
|
22
|
+
UINT16BE = Erlang::ETF::Term::UINT16BE
|
23
|
+
|
24
|
+
class << self
|
25
|
+
def [](term)
|
26
|
+
return term if term.kind_of?(Erlang::ETF::Term)
|
27
|
+
term = Erlang.from(term) if not term.kind_of?(Erlang::Atom)
|
28
|
+
return new(term)
|
29
|
+
end
|
30
|
+
|
31
|
+
def erlang_load(buffer)
|
32
|
+
size, = buffer.read(2).unpack(UINT16BE)
|
33
|
+
data = buffer.read(size)
|
34
|
+
return new(Erlang::Atom[data])
|
35
|
+
end
|
32
36
|
end
|
33
37
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
buffer << atom_name.to_utf8_binary
|
38
|
-
end
|
39
|
-
|
40
|
-
finalize
|
41
|
-
|
42
|
-
# Instantiate the new atom.
|
43
|
-
#
|
44
|
-
# @example Instantiate the atom.
|
45
|
-
# Erlang::ETF::Atom.new("test")
|
46
|
-
# # => #<Erlang::ETF::Atom @tag=100 @len=4 @atom_name="test">
|
47
|
-
#
|
48
|
-
# @param [ ::String ] atom_name The `AtomName` as a string.
|
49
|
-
#
|
50
|
-
# @since 1.0.0
|
51
|
-
def initialize(atom_name)
|
52
|
-
@atom_name = atom_name
|
53
|
-
@len = atom_name.to_s.bytesize
|
38
|
+
def initialize(term)
|
39
|
+
raise ArgumentError, "term must be of type Erlang::Atom" if not term.kind_of?(Erlang::Atom)
|
40
|
+
@term = term
|
54
41
|
end
|
55
42
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
# # => :test
|
62
|
-
#
|
63
|
-
# @return [ ::Symbol ] The `AtomName` as a symbol.
|
64
|
-
#
|
65
|
-
# @since 1.0.0
|
66
|
-
def __ruby_evolve__
|
67
|
-
atom_name.intern
|
43
|
+
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
|
44
|
+
buffer << ATOM_EXT
|
45
|
+
buffer << [@term.size].pack(UINT16BE)
|
46
|
+
buffer << Erlang::ETF::Term.binary_encoding(@term.data)
|
47
|
+
return buffer
|
68
48
|
end
|
69
49
|
end
|
70
50
|
end
|
71
|
-
end
|
51
|
+
end
|
data/lib/erlang/etf/atom_utf8.rb
CHANGED
@@ -2,9 +2,9 @@ module Erlang
|
|
2
2
|
module ETF
|
3
3
|
|
4
4
|
#
|
5
|
-
# 1 | 2 | Len
|
6
|
-
# --- | --- | --------
|
7
|
-
# 118 | Len | AtomName
|
5
|
+
# | 1 | 2 | Len |
|
6
|
+
# | --- | --- | -------- |
|
7
|
+
# | 118 | Len | AtomName |
|
8
8
|
#
|
9
9
|
# An atom is stored with a 2 byte unsigned length in big-endian
|
10
10
|
# order, followed by `Len` bytes containing the `AtomName` encoded
|
@@ -15,55 +15,35 @@ module Erlang
|
|
15
15
|
# [`ATOM_UTF8_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#ATOM_UTF8_EXT
|
16
16
|
#
|
17
17
|
class AtomUTF8
|
18
|
-
include Term
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
18
|
+
include Erlang::ETF::Term
|
19
|
+
|
20
|
+
UINT16BE = Erlang::ETF::Term::UINT16BE
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def [](term)
|
24
|
+
return term if term.kind_of?(Erlang::ETF::Term)
|
25
|
+
term = Erlang.from(term) if not term.kind_of?(Erlang::Atom)
|
26
|
+
return new(term)
|
27
|
+
end
|
28
|
+
|
29
|
+
def erlang_load(buffer)
|
30
|
+
size, = buffer.read(2).unpack(UINT16BE)
|
31
|
+
data = buffer.read(size)
|
32
|
+
return new(Erlang::Atom[data, utf8: true])
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
buffer << atom_name.to_utf8_binary
|
36
|
-
end
|
37
|
-
|
38
|
-
finalize
|
39
|
-
|
40
|
-
# Instantiate the new UTF-8 atom.
|
41
|
-
#
|
42
|
-
# @example Instantiate the UTF-8 atom.
|
43
|
-
# Erlang::ETF::AtomUTF8.new("Ωmega")
|
44
|
-
# # => #<Erlang::ETF::AtomUTF8 @tag=118 @len=5 @atom_name="Ωmega">
|
45
|
-
#
|
46
|
-
# @param [ ::String ] atom_name The `AtomName` as a string.
|
47
|
-
#
|
48
|
-
# @since 1.0.0
|
49
|
-
def initialize(atom_name)
|
50
|
-
@atom_name = atom_name
|
51
|
-
@len = atom_name.to_s.bytesize
|
36
|
+
def initialize(term)
|
37
|
+
raise ArgumentError, "term must be of type Erlang::Atom" if not term.kind_of?(Erlang::Atom)
|
38
|
+
@term = term
|
52
39
|
end
|
53
40
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
# # => :'Ωmega'
|
60
|
-
#
|
61
|
-
# @return [ ::Symbol ] The `AtomName` as a symbol.
|
62
|
-
#
|
63
|
-
# @since 1.0.0
|
64
|
-
def __ruby_evolve__
|
65
|
-
atom_name.intern
|
41
|
+
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
|
42
|
+
buffer << ATOM_UTF8_EXT
|
43
|
+
buffer << [@term.size].pack(UINT16BE)
|
44
|
+
buffer << Erlang::ETF::Term.binary_encoding(@term.data)
|
45
|
+
return buffer
|
66
46
|
end
|
67
47
|
end
|
68
48
|
end
|
69
|
-
end
|
49
|
+
end
|
data/lib/erlang/etf/binary.rb
CHANGED
@@ -2,9 +2,9 @@ module Erlang
|
|
2
2
|
module ETF
|
3
3
|
|
4
4
|
#
|
5
|
-
# 1 | 4 | Len
|
6
|
-
# --- | --- | ----
|
7
|
-
# 109 | Len | Data
|
5
|
+
# | 1 | 4 | Len |
|
6
|
+
# | --- | --- | ---- |
|
7
|
+
# | 109 | Len | Data |
|
8
8
|
#
|
9
9
|
# Binaries are generated with bit syntax expression or with
|
10
10
|
# [`list_to_binary/1`], [`term_to_binary/1`], or as input from
|
@@ -19,33 +19,34 @@ module Erlang
|
|
19
19
|
# [`BINARY_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#BINARY_EXT
|
20
20
|
#
|
21
21
|
class Binary
|
22
|
-
include Term
|
22
|
+
include Erlang::ETF::Term
|
23
23
|
|
24
|
-
|
24
|
+
UINT32BE = Erlang::ETF::Term::UINT32BE
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
def deserialize_data(buffer)
|
32
|
-
self.data = buffer.read(len).from_utf8_binary
|
33
|
-
end
|
26
|
+
class << self
|
27
|
+
def [](term)
|
28
|
+
term = Erlang.from(term) if not term.kind_of?(Erlang::Binary)
|
29
|
+
return new(term)
|
30
|
+
end
|
34
31
|
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
def erlang_load(buffer)
|
33
|
+
size, = buffer.read(4).unpack(UINT32BE)
|
34
|
+
data = buffer.read(size)
|
35
|
+
return new(Erlang::Binary[data])
|
36
|
+
end
|
38
37
|
end
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
@data = data
|
39
|
+
def initialize(term)
|
40
|
+
raise ArgumentError, "term must be of type Erlang::Binary" if not term.kind_of?(Erlang::Binary)
|
41
|
+
@term = term
|
44
42
|
end
|
45
43
|
|
46
|
-
def
|
47
|
-
|
44
|
+
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
|
45
|
+
buffer << BINARY_EXT
|
46
|
+
buffer << [@term.bytesize].pack(UINT32BE)
|
47
|
+
buffer << Erlang::ETF::Term.binary_encoding(@term.data)
|
48
|
+
return buffer
|
48
49
|
end
|
49
50
|
end
|
50
51
|
end
|
51
|
-
end
|
52
|
+
end
|
@@ -2,9 +2,9 @@ module Erlang
|
|
2
2
|
module ETF
|
3
3
|
|
4
4
|
#
|
5
|
-
# 1 | 4 | 1 | Len
|
6
|
-
# --- | --- | ---- | ----
|
7
|
-
# 77 | Len | Bits | Data
|
5
|
+
# | 1 | 4 | 1 | Len |
|
6
|
+
# | --- | --- | ---- | ---- |
|
7
|
+
# | 77 | Len | Bits | Data |
|
8
8
|
#
|
9
9
|
# This term represents a bitstring whose length in bits is not a
|
10
10
|
# multiple of 8 (created using the bit syntax in R12B and later).
|
@@ -18,34 +18,42 @@ module Erlang
|
|
18
18
|
# [`BIT_BINARY_EXT`]: http://erlang.org/doc/apps/erts/erl_ext_dist.html#BIT_BINARY_EXT
|
19
19
|
#
|
20
20
|
class BitBinary
|
21
|
-
include Term
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
buffer
|
21
|
+
include Erlang::ETF::Term
|
22
|
+
|
23
|
+
UINT8 = Erlang::ETF::Term::UINT8
|
24
|
+
UINT32BE = Erlang::ETF::Term::UINT32BE
|
25
|
+
HEAD = (UINT32BE + UINT8).freeze
|
26
|
+
|
27
|
+
class << self
|
28
|
+
def [](term)
|
29
|
+
term = Erlang.from(term) if not term.kind_of?(Erlang::Bitstring)
|
30
|
+
return new(term)
|
31
|
+
end
|
32
|
+
|
33
|
+
def erlang_load(buffer)
|
34
|
+
size, bits, = buffer.read(5).unpack(HEAD)
|
35
|
+
data = buffer.read(size)
|
36
|
+
if size > 0
|
37
|
+
data.setbyte(-1, data.getbyte(-1) >> (8 - bits))
|
38
|
+
end
|
39
|
+
return new(Erlang::Bitstring[data, bits: bits])
|
40
|
+
end
|
34
41
|
end
|
35
42
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
self.data = buffer.read(len).from_utf8_binary
|
40
|
-
self
|
43
|
+
def initialize(term)
|
44
|
+
raise ArgumentError, "term must be of type Erlang::Bitstring" if not term.kind_of?(Erlang::Bitstring) and not term.kind_of?(Erlang::Binary)
|
45
|
+
@term = term
|
41
46
|
end
|
42
47
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
+
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
|
49
|
+
buffer << BIT_BINARY_EXT
|
50
|
+
buffer << [@term.bytesize, @term.bits].pack(HEAD)
|
51
|
+
buffer << Erlang::ETF::Term.binary_encoding(@term.data)
|
52
|
+
if @term.bytesize > 0
|
53
|
+
buffer.setbyte(-1, buffer.getbyte(-1) << (8 - @term.bits))
|
54
|
+
end
|
55
|
+
return buffer
|
48
56
|
end
|
49
57
|
end
|
50
58
|
end
|
51
|
-
end
|
59
|
+
end
|
@@ -4,17 +4,17 @@ module Erlang
|
|
4
4
|
module ETF
|
5
5
|
|
6
6
|
#
|
7
|
-
# 1 | 4 | N
|
8
|
-
# --- | ---------------- | -------------------
|
9
|
-
# 80 | UncompressedSize | Zlib-compressedData
|
7
|
+
# | 1 | 4 | N |
|
8
|
+
# | --- | ---------------- | ------------------- |
|
9
|
+
# | 80 | UncompressedSize | Zlib-compressedData |
|
10
10
|
#
|
11
|
-
# Uncompressed Size (unsigned 32 bit integer in big-endian
|
12
|
-
# byte order) is the size of the data before it was compressed.
|
11
|
+
# Uncompressed Size (unsigned 32 bit integer in big-endian
|
12
|
+
# byte order) is the size of the data before it was compressed.
|
13
13
|
# The compressed data has the following format when it has been expanded:
|
14
14
|
#
|
15
|
-
# 1 | Uncompressed Size
|
16
|
-
# ---- | -----------------
|
17
|
-
# Tag | Data
|
15
|
+
# | 1 | Uncompressed Size |
|
16
|
+
# | ---- | ----------------- |
|
17
|
+
# | Tag | Data |
|
18
18
|
#
|
19
19
|
# (see [`External Term Format`] and [`term_to_binary/2`])
|
20
20
|
#
|
@@ -22,45 +22,71 @@ module Erlang
|
|
22
22
|
# [`term_to_binary/2`]: http://www.erlang.org/doc/man/erlang.html#term_to_binary-2
|
23
23
|
#
|
24
24
|
class Compressed
|
25
|
-
include Term
|
25
|
+
include Erlang::ETF::Term
|
26
26
|
|
27
|
-
|
27
|
+
LEVEL_RANGE = (0..9).freeze
|
28
|
+
LEVEL_DEFAULT = 6.freeze
|
28
29
|
|
29
|
-
|
30
|
+
UINT32BE = Erlang::ETF::Term::UINT32BE
|
30
31
|
|
31
|
-
|
32
|
+
class << self
|
33
|
+
def [](term, uncompressed_size = nil, compressed_data = nil, level: LEVEL_DEFAULT)
|
34
|
+
term = Erlang.from(term)
|
35
|
+
return new(term, uncompressed_size, compressed_data, level)
|
36
|
+
end
|
32
37
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
def erlang_load(buffer)
|
39
|
+
uncompressed_size, = buffer.read(4).unpack(UINT32BE)
|
40
|
+
compressed_data = buffer.read()
|
41
|
+
uncompressed_data = ::Zlib::Inflate.inflate(compressed_data)
|
42
|
+
if uncompressed_size == uncompressed_data.bytesize
|
43
|
+
term = Erlang.from(Erlang::ETF.read_term(StringIO.new(uncompressed_data)))
|
44
|
+
return new(term, uncompressed_size, compressed_data)
|
45
|
+
else
|
46
|
+
raise ::Zlib::DataError, "UncompressedSize value did not match the size of the uncompressed data"
|
47
|
+
end
|
41
48
|
end
|
42
49
|
end
|
43
50
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
51
|
+
def initialize(term, uncompressed_size = nil, compressed_data = nil, level = LEVEL_DEFAULT)
|
52
|
+
raise ArgumentError, "term must be of any type" if not Erlang.is_any(term)
|
53
|
+
@term = term
|
54
|
+
@uncompressed_size = uncompressed_size
|
55
|
+
@compressed_data = compressed_data
|
56
|
+
@level = LEVEL_RANGE.include?(level) ? level : LEVEL_DEFAULT
|
49
57
|
end
|
50
58
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
59
|
+
def erlang_dump(buffer = ::String.new.force_encoding(BINARY_ENCODING))
|
60
|
+
buffer << COMPRESSED
|
61
|
+
if @uncompressed_size.nil? and @compressed_data.nil?
|
62
|
+
uncompressed_data = Erlang::ETF.write_term(@term, ::String.new.force_encoding(BINARY_ENCODING))
|
63
|
+
uncompressed_size = uncompressed_data.bytesize
|
64
|
+
compressed_data = ::Zlib::Deflate.deflate(uncompressed_data, @level)
|
65
|
+
buffer << [uncompressed_size].pack(UINT32BE)
|
66
|
+
buffer << Erlang::ETF::Term.binary_encoding(compressed_data)
|
67
|
+
else
|
68
|
+
buffer << [@uncompressed_size].pack(UINT32BE)
|
69
|
+
buffer << Erlang::ETF::Term.binary_encoding(@compressed_data)
|
70
|
+
end
|
71
|
+
return buffer
|
72
|
+
end
|
55
73
|
|
56
|
-
def
|
57
|
-
@
|
58
|
-
|
74
|
+
def inspect
|
75
|
+
if @uncompressed_size.nil? and @compressed_data.nil?
|
76
|
+
return "#{self.class}[#{@term.inspect}, level: #{@level.inspect}]"
|
77
|
+
else
|
78
|
+
return "#{self.class}[#{@term.inspect}, #{@uncompressed_size.inspect}, #{@compressed_data.inspect}, level: #{@level.inspect}]"
|
79
|
+
end
|
59
80
|
end
|
60
81
|
|
61
|
-
def
|
62
|
-
|
82
|
+
def pretty_print(pp)
|
83
|
+
state = [@term]
|
84
|
+
state.push(@uncompressed_size, @compressed_data) if not @uncompressed_size.nil? or not @compressed_data.nil?
|
85
|
+
return pp.group(1, "#{self.class}[", ", level: #{@level.inspect}]") do
|
86
|
+
pp.breakable ''
|
87
|
+
pp.seplist(state) { |obj| obj.pretty_print(pp) }
|
88
|
+
end
|
63
89
|
end
|
64
90
|
end
|
65
91
|
end
|
66
|
-
end
|
92
|
+
end
|