test_sdk1 1.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 +7 -0
- data/CONTRIBUTING.md +1 -0
- data/LICENSE +201 -0
- data/README.md +147 -0
- data/SECURITY.md +12 -0
- data/lib/crypto/00_asymmetric_key.rb +95 -0
- data/lib/crypto/01_ed25519.rb +67 -0
- data/lib/crypto/asymmetric_key.rb +87 -0
- data/lib/crypto/ed25519_key.rb +44 -0
- data/lib/crypto/key_pair.rb +40 -0
- data/lib/crypto/keys.rb +7 -0
- data/lib/crypto/secp256k1_key.rb +0 -0
- data/lib/crypto/test_ed25519_key.rb +44 -0
- data/lib/entity/account.rb +45 -0
- data/lib/entity/action_thresholds.rb +25 -0
- data/lib/entity/associated_key.rb +24 -0
- data/lib/entity/auction_state.rb +36 -0
- data/lib/entity/bid.rb +24 -0
- data/lib/entity/bid_info.rb +51 -0
- data/lib/entity/contract.rb +47 -0
- data/lib/entity/contract_package.rb +41 -0
- data/lib/entity/contract_version.rb +33 -0
- data/lib/entity/delegator.rb +37 -0
- data/lib/entity/deploy.rb +44 -0
- data/lib/entity/deploy_approval.rb +24 -0
- data/lib/entity/deploy_executable.rb +162 -0
- data/lib/entity/deploy_executable_item_internal.rb +26 -0
- data/lib/entity/deploy_executable_transfer.rb +50 -0
- data/lib/entity/deploy_hash.rb +16 -0
- data/lib/entity/deploy_header.rb +60 -0
- data/lib/entity/deploy_info.rb +44 -0
- data/lib/entity/deploy_named_argument.rb +19 -0
- data/lib/entity/deploy_transfer.rb +10 -0
- data/lib/entity/disabled_version.rb +26 -0
- data/lib/entity/era_info.rb +18 -0
- data/lib/entity/era_summary.rb +44 -0
- data/lib/entity/era_validator.rb +23 -0
- data/lib/entity/executable_deploy_item.rb +11 -0
- data/lib/entity/group.rb +25 -0
- data/lib/entity/module_bytes.rb +50 -0
- data/lib/entity/peer.rb +25 -0
- data/lib/entity/seigniorage_allocation.rb +18 -0
- data/lib/entity/stored_contract_by_hash.rb +50 -0
- data/lib/entity/stored_contract_by_name.rb +50 -0
- data/lib/entity/stored_value.rb +57 -0
- data/lib/entity/stored_versioned_contract_by_hash.rb +61 -0
- data/lib/entity/stored_versioned_contract_by_name.rb +61 -0
- data/lib/entity/transfer.rb +65 -0
- data/lib/entity/validator_weight.rb +23 -0
- data/lib/entity/vesting_schedule.rb +22 -0
- data/lib/include.rb +18 -0
- data/lib/rpc/rpc.rb +227 -0
- data/lib/rpc/rpc_client.rb +233 -0
- data/lib/rpc/rpc_error.rb +79 -0
- data/lib/serialization/cl_type_serializer.rb +76 -0
- data/lib/serialization/cl_value_bytes_parsers.rb +498 -0
- data/lib/serialization/cl_value_serializer.rb +259 -0
- data/lib/serialization/deploy_approval_serializer.rb +15 -0
- data/lib/serialization/deploy_executable_serializer.rb +27 -0
- data/lib/serialization/deploy_header_serializer.rb +49 -0
- data/lib/serialization/deploy_named_arg_serializer.rb +19 -0
- data/lib/serialization/deploy_serializer.rb +268 -0
- data/lib/serialization/test.rb +431 -0
- data/lib/test_sdk1.rb +289 -0
- data/lib/types/cl_account_hash.rb +24 -0
- data/lib/types/cl_account_hash_type.rb +22 -0
- data/lib/types/cl_any.rb +25 -0
- data/lib/types/cl_any_type.rb +22 -0
- data/lib/types/cl_bool.rb +32 -0
- data/lib/types/cl_bool_type.rb +35 -0
- data/lib/types/cl_byte_array.rb +25 -0
- data/lib/types/cl_byte_array_type.rb +27 -0
- data/lib/types/cl_i32.rb +26 -0
- data/lib/types/cl_i32_type.rb +26 -0
- data/lib/types/cl_i64.rb +26 -0
- data/lib/types/cl_i64_type.rb +27 -0
- data/lib/types/cl_key.rb +39 -0
- data/lib/types/cl_key_type.rb +27 -0
- data/lib/types/cl_list.rb +25 -0
- data/lib/types/cl_list_type.rb +26 -0
- data/lib/types/cl_map.rb +25 -0
- data/lib/types/cl_map_type.rb +26 -0
- data/lib/types/cl_option.rb +33 -0
- data/lib/types/cl_option_type.rb +52 -0
- data/lib/types/cl_public_key.rb +152 -0
- data/lib/types/cl_public_key_type.rb +26 -0
- data/lib/types/cl_result.rb +25 -0
- data/lib/types/cl_result_type.rb +26 -0
- data/lib/types/cl_string.rb +39 -0
- data/lib/types/cl_string_type.rb +32 -0
- data/lib/types/cl_tuple.rb +151 -0
- data/lib/types/cl_tuple_type.rb +108 -0
- data/lib/types/cl_type.rb +94 -0
- data/lib/types/cl_type_tag.rb +51 -0
- data/lib/types/cl_u128.rb +26 -0
- data/lib/types/cl_u128_type.rb +26 -0
- data/lib/types/cl_u256.rb +26 -0
- data/lib/types/cl_u256_type.rb +26 -0
- data/lib/types/cl_u32.rb +26 -0
- data/lib/types/cl_u32_type.rb +26 -0
- data/lib/types/cl_u512.rb +26 -0
- data/lib/types/cl_u512_type.rb +26 -0
- data/lib/types/cl_u64.rb +26 -0
- data/lib/types/cl_u64_type.rb +27 -0
- data/lib/types/cl_u8.rb +26 -0
- data/lib/types/cl_u8_type.rb +26 -0
- data/lib/types/cl_unit.rb +38 -0
- data/lib/types/cl_unit_type.rb +22 -0
- data/lib/types/cl_uref.rb +120 -0
- data/lib/types/cl_uref_type.rb +46 -0
- data/lib/types/cl_value.rb +10 -0
- data/lib/types/constants.rb +50 -0
- data/lib/types/error.rb +7 -0
- data/lib/utils/base_16.rb +18 -0
- data/lib/utils/byte_utils.rb +107 -0
- data/lib/utils/find_byte_parser_by_cl_type.rb +53 -0
- data/lib/utils/hash_utils.rb +19 -0
- data/lib/utils/hex_utils.rb +12 -0
- data/lib/utils/time_utils.rb +85 -0
- data/lib/utils/utils.rb +2 -0
- data/lib/version.rb +3 -0
- data/spec/a_spec.rb +697 -0
- data/spec/byte_utils_spec.rb +72 -0
- data/spec/cl_public_spec.rb +169 -0
- data/spec/cl_types_spec.rb +715 -0
- data/spec/cl_value_serializer_spec.rb +140 -0
- data/spec/client_spec.rb +25 -0
- data/spec/crypto_spec.rb +42 -0
- data/spec/deploy_approval_serializer_spec.rb +26 -0
- data/spec/deploy_executable_serializer_spec.rb +0 -0
- data/spec/deploy_header_serializer_spec.rb +21 -0
- data/spec/deploy_named_arg_serializer_spec.rb +49 -0
- data/spec/deploy_serializer_spec.rb +77 -0
- data/spec/deploy_serializer_test_spec.rb +225 -0
- data/spec/mainnet_spec.rb +452 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/string_spec.rb +68 -0
- data/spec/testnet_spec.rb +498 -0
- data/spec/time_utils_spec.rb +87 -0
- metadata +198 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative './cl_list_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class CLList < CLValue
|
8
|
+
include CLValueBytesParsers::CLListBytesParser
|
9
|
+
|
10
|
+
def initialize(value = nil)
|
11
|
+
super
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_cl_type
|
16
|
+
@cl_type = CLListType.new
|
17
|
+
@cl_type.to_string
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_value
|
21
|
+
@value
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLListType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(14).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[14].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
data/lib/types/cl_map.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative './cl_map_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class CLMap < CLValue
|
8
|
+
include CLValueBytesParsers::CLMapBytesParser
|
9
|
+
|
10
|
+
def initialize(value = nil)
|
11
|
+
super
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_cl_type
|
16
|
+
@cl_type = CLMapType.new
|
17
|
+
@cl_type.to_string
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_value
|
21
|
+
@value
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLMapType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(17).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[17].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative './cl_option_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
=begin
|
6
|
+
https://doc.rust-lang.org/stable/std/option/
|
7
|
+
=end
|
8
|
+
|
9
|
+
class CLOption < CLValue
|
10
|
+
include CLValueBytesParsers::CLOptionBytesParser
|
11
|
+
|
12
|
+
def initialize(data = nil, inner_type = nil)
|
13
|
+
super
|
14
|
+
@data = data
|
15
|
+
@inner_type = inner_type
|
16
|
+
if data == nil && inner_type == nil
|
17
|
+
raise ArgumentError.new("You had to assign innerType for None")
|
18
|
+
elsif data == nil && inner_type != nil
|
19
|
+
@inner_type = inner_type
|
20
|
+
else
|
21
|
+
@inner_type = data.get_cl_type
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_value
|
26
|
+
@data
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_cl_type
|
30
|
+
CLOptionType.new(@inner_type)
|
31
|
+
@inner_type
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './cl_bool.rb'
|
3
|
+
require_relative './cl_bool_type.rb'
|
4
|
+
require_relative './constants.rb'
|
5
|
+
|
6
|
+
optionTags = {
|
7
|
+
NONE: 0,
|
8
|
+
SOME: 1
|
9
|
+
}
|
10
|
+
|
11
|
+
class CLOptionType < CLType
|
12
|
+
|
13
|
+
def initialize(inner = nil)
|
14
|
+
@tag = TAGS[:Option]
|
15
|
+
@inner = inner
|
16
|
+
# p @inner.to_string
|
17
|
+
# p @inner.to_json
|
18
|
+
# p @inner.get_tag
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [String]
|
22
|
+
def to_string
|
23
|
+
@inner == nil ? TAGS.key(13).to_s + " (None)" : TAGS.key(13).to_s + " (#{@inner.to_string})"
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_json
|
27
|
+
jsoned = { "#{TAGS.key(13)}": @inner.to_string }.to_json
|
28
|
+
# h = JSON.parse(jsoned)
|
29
|
+
# h
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_type
|
33
|
+
TAGS.key(13).to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_inner_type
|
37
|
+
@inner
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_bytes
|
41
|
+
arr = []
|
42
|
+
arr << @tag << @inner.get_tag
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.to_string
|
46
|
+
TAGS.key(13).to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_bytes
|
50
|
+
[13].pack("C*").unpack1("H*")
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,152 @@
|
|
1
|
+
require_relative './cl_public_key_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
require_relative '../utils/base_16.rb'
|
5
|
+
require_relative '../utils/hex_utils.rb'
|
6
|
+
require_relative '../utils/hash_utils.rb'
|
7
|
+
require 'blake2'
|
8
|
+
=begin
|
9
|
+
PublicKey serializes as a single byte tag representing the algorithm followed by 32 bytes of the PublicKey itself:
|
10
|
+
If the PublicKey is an Ed25519 key, the single tag byte is 1 followed by the individual bytes of the serialized key.
|
11
|
+
If the PublicKey is a Secp256k1 key, the single tag byte is a 2 followed by the individual bytes of the serialized key.
|
12
|
+
=end
|
13
|
+
ED25519_LENGTH = 32
|
14
|
+
SECP256K1_LENGTH = 33
|
15
|
+
|
16
|
+
|
17
|
+
CLPublicKeyTag = {
|
18
|
+
ED25519: 1,
|
19
|
+
SECP256K1: 2
|
20
|
+
}
|
21
|
+
|
22
|
+
SignatureAlgorithm = {
|
23
|
+
Ed25519: 'ed25519',
|
24
|
+
Secp256K1: 'secp256k1'
|
25
|
+
}
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
class CLPublicKey < CLValue
|
31
|
+
include CLValueBytesParsers::CLPublicKeyBytesParser
|
32
|
+
include Utils::HashUtils
|
33
|
+
# @param [Array<Integer>] raw_public_key
|
34
|
+
# @param [Integer] tag
|
35
|
+
def initialize(raw_public_key, tag)
|
36
|
+
super()
|
37
|
+
raw_public_key_length_valid?(raw_public_key, tag)
|
38
|
+
end
|
39
|
+
|
40
|
+
def raw_public_key_length_valid?(raw_public_key, tag)
|
41
|
+
if tag == CLPublicKeyTag[:ED25519] || tag == SignatureAlgorithm[:Ed25519]
|
42
|
+
if raw_public_key.length != ED25519_LENGTH
|
43
|
+
raise ArgumentError.new("Wrong length of ED25519 key. Expected #{ED25519_LENGTH}, but got #{raw_public_key.length}")
|
44
|
+
end
|
45
|
+
@raw_public_key = raw_public_key
|
46
|
+
@tag = tag
|
47
|
+
elsif tag == CLPublicKeyTag[:SECP256K1] || tag == SignatureAlgorithm[:Secp256K1]
|
48
|
+
if raw_public_key.length != SECP256K1_LENGTH
|
49
|
+
raise ArgumentError.new("Wrong length of SECP256K1 key. Expected #{SECP256K1_LENGTH}, but got #{raw_public_key.length}")
|
50
|
+
end
|
51
|
+
@raw_public_key = raw_public_key
|
52
|
+
@tag = tag
|
53
|
+
else
|
54
|
+
raise ArgumentError.new("Unsupported type of public key")
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_cl_type
|
59
|
+
@cl_type = CLPublicKeyType.new
|
60
|
+
@cl_type.to_string
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def get_value
|
65
|
+
@raw_public_key
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_cl_public_key_tag
|
69
|
+
if @tag == CLPublicKeyTag[:ED25519] || @tag == SignatureAlgorithm[:Ed25519]
|
70
|
+
CLPublicKeyTag[:ED25519]
|
71
|
+
else
|
72
|
+
CLPublicKeyTag[:SECP256K1]
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_signature_algorithm
|
77
|
+
if @tag == CLPublicKeyTag[:ED25519] || @tag == SignatureAlgorithm[:Ed25519]
|
78
|
+
SignatureAlgorithm[:Ed25519]
|
79
|
+
else
|
80
|
+
SignatureAlgorithm[:Secp256K1]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def ed25519?
|
85
|
+
@tag == CLPublicKeyTag[:ED25519]
|
86
|
+
end
|
87
|
+
|
88
|
+
def secp256k1?
|
89
|
+
@tag == CLPublicKeyTag[:SECP256K1]
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [Array<Integer>]
|
93
|
+
def to_account_hash_byte_array
|
94
|
+
key_name = CLPublicKeyTag.key(@tag).to_s
|
95
|
+
prefix = key_name.downcase.unpack("C*") + [0]
|
96
|
+
bytes = prefix + @raw_public_key
|
97
|
+
result_array = Utils::HashUtils.byte_hash(bytes)
|
98
|
+
@raw_public_key.length == 0 ? [] : result_array
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [String] hex
|
102
|
+
def to_account_hash_hex
|
103
|
+
bytes = to_account_hash_byte_array
|
104
|
+
hex = Utils::HashUtils.account_hash_from_byte_to_hex(bytes)
|
105
|
+
end
|
106
|
+
|
107
|
+
def from_ed25519(public_key)
|
108
|
+
CLPublicKey.new(public_key, CLPublicKeyTag[:ED25519])
|
109
|
+
end
|
110
|
+
|
111
|
+
def self.from_ed25519(public_key)
|
112
|
+
CLPublicKey.new(public_key, CLPublicKeyTag[:ED25519])
|
113
|
+
end
|
114
|
+
|
115
|
+
def from_secp256k1(public_key)
|
116
|
+
CLPublicKey.new(public_key, CLPublicKeyTag[:SECP256K1])
|
117
|
+
end
|
118
|
+
|
119
|
+
def self.from_secp256k1(public_key)
|
120
|
+
CLPublicKey.new(public_key, CLPublicKeyTag[:SECP256K1])
|
121
|
+
end
|
122
|
+
|
123
|
+
def to_hex
|
124
|
+
# "0#{@tag}#{Utils::Base16.encode16(@raw_public_key)}"
|
125
|
+
"0#{@tag}#{CLValueBytesParsers::CLPublicKeyBytesParser.encode_base_16(@raw_public_key)}"
|
126
|
+
end
|
127
|
+
|
128
|
+
def from_hex(public_key_hex)
|
129
|
+
raise ArgumentError.new("Invalid public key") unless Utils::HexUtils.valid_public_key_format?(public_key_hex)
|
130
|
+
public_key_hex_bytes = Utils::Base16.decode16(public_key_hex)
|
131
|
+
CLPublicKey.new(public_key_hex_bytes.drop(1), public_key_hex_bytes[0])
|
132
|
+
end
|
133
|
+
|
134
|
+
def self.from_hex(public_key_hex)
|
135
|
+
raise ArgumentError.new("Invalid public key") unless Utils::HexUtils.valid_public_key_format?(public_key_hex)
|
136
|
+
public_key_hex_bytes = Utils::Base16.decode16(public_key_hex)
|
137
|
+
CLPublicKey.new(public_key_hex_bytes.drop(1), public_key_hex_bytes[0])
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.to_json(public_key)
|
141
|
+
json = {"bytes": public_key.to_hex, "cl_type": public_key.get_cl_type}.to_json
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.from_json(json)
|
145
|
+
parsed = JSON.parse(json).deep_symbolize_keys
|
146
|
+
bytes = Utils::Base16.decode16(parsed[:bytes])
|
147
|
+
tag = bytes[0]
|
148
|
+
raw_public_key = bytes[1..]
|
149
|
+
CLPublicKey.new(raw_public_key, tag)
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLPublicKeyType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(22).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[22].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative './cl_result_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
|
7
|
+
class CLResult < CLValue
|
8
|
+
include CLValueBytesParsers::CLResultBytesParser
|
9
|
+
|
10
|
+
def initialize(value = nil)
|
11
|
+
super
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_cl_type
|
16
|
+
@cl_type = CLResultType.new
|
17
|
+
@cl_type.to_string
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_value
|
21
|
+
@value
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLResultType < CLType
|
6
|
+
def initialize(value = nil)
|
7
|
+
super(value)
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_string
|
12
|
+
TAGS.key(16).to_s
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_value
|
16
|
+
@value
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_json
|
20
|
+
to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_bytes
|
24
|
+
[16].pack("C*").unpack1("H*")
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require_relative './cl_string_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
4
|
+
|
5
|
+
|
6
|
+
class CLString < CLValue
|
7
|
+
attr_accessor :cl_value
|
8
|
+
alias_method :clvalue?, :cl_value
|
9
|
+
include CLValueBytesParsers::CLStringBytesParser
|
10
|
+
|
11
|
+
def initialize(value)
|
12
|
+
super()
|
13
|
+
# raise "error" unless value.is_a?(String)
|
14
|
+
raise "error" unless value.instance_of? String
|
15
|
+
@value = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_cl_type
|
19
|
+
@cl_string_type = CLStringType.new
|
20
|
+
@cl_string_type.to_string
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_value
|
24
|
+
@value
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_size
|
28
|
+
@value.length
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.to_bytes(clvalue)
|
32
|
+
value = clvalue.get_value
|
33
|
+
len = value.length
|
34
|
+
hex1 = len.to_s(16).rjust(8, '0').scan(/../).reverse.join('')
|
35
|
+
hex2 = value.unpack("H*").first
|
36
|
+
hex1 + hex2
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative './cl_type.rb'
|
2
|
+
require_relative './constants.rb'
|
3
|
+
|
4
|
+
|
5
|
+
class CLStringType < CLType
|
6
|
+
|
7
|
+
def initialize(value = nil)
|
8
|
+
super(value)
|
9
|
+
@value = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_string
|
13
|
+
TAGS.key(10).to_s
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_value
|
17
|
+
@value
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_json
|
21
|
+
to_string
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_bytes
|
25
|
+
[10].pack("C*").unpack1("H*")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|
@@ -0,0 +1,151 @@
|
|
1
|
+
require_relative './cl_tuple_type.rb'
|
2
|
+
require_relative './cl_value.rb'
|
3
|
+
require_relative './error.rb'
|
4
|
+
require_relative '../serialization/cl_value_bytes_parsers.rb'
|
5
|
+
|
6
|
+
|
7
|
+
|
8
|
+
class CLTuple < CLValue
|
9
|
+
include CLValueBytesParsers::CLTupleBytesParser
|
10
|
+
attr_accessor :size, :data
|
11
|
+
# before_filter: get_cl_type
|
12
|
+
def initialize(size, data)
|
13
|
+
super()
|
14
|
+
@size = size
|
15
|
+
@data = data
|
16
|
+
@all_members_are_clvalues = data.all? { |item| item.is_a?(CLValue)}
|
17
|
+
@tuple_name = ""
|
18
|
+
if data.size > size && @all_members_are_clvalues
|
19
|
+
begin
|
20
|
+
raise Error.new("Too many elements!")
|
21
|
+
rescue => e
|
22
|
+
e.err
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
if @all_members_are_clvalues && data.size == size
|
27
|
+
@size = size
|
28
|
+
@data = data
|
29
|
+
else
|
30
|
+
begin
|
31
|
+
raise Error.new("Invalid data type(s) provided.")
|
32
|
+
rescue => e
|
33
|
+
e.err
|
34
|
+
end
|
35
|
+
end
|
36
|
+
get_full_type
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_full_type
|
40
|
+
if @all_members_are_clvalues
|
41
|
+
if @data.size == @size
|
42
|
+
if @data.size == 1
|
43
|
+
@cl_type = CLTuple1Type.new
|
44
|
+
@tuple_name = @cl_type.to_string
|
45
|
+
@cl_type.to_string + " (" + @data[0].get_cl_type + ")"
|
46
|
+
elsif @data.size == 2
|
47
|
+
@cl_type = CLTuple2Type.new
|
48
|
+
@tuple_name = @cl_type.to_string
|
49
|
+
@cl_type.to_string + " (" + @data[0].get_cl_type + ", " + @data[1].get_cl_type + ")"
|
50
|
+
elsif @data.size == 3
|
51
|
+
@cl_type = CLTuple3Type.new
|
52
|
+
@tuple_name = @cl_type.to_string
|
53
|
+
@cl_type.to_string + " (" + @data[0].get_cl_type + ", " + @data[1].get_cl_type + ", " + @data[2].get_cl_type + ")"
|
54
|
+
else
|
55
|
+
begin
|
56
|
+
raise Error.new("Tuple is not defined!")
|
57
|
+
rescue => e
|
58
|
+
e.err
|
59
|
+
end
|
60
|
+
end
|
61
|
+
elsif @data.size > size
|
62
|
+
begin
|
63
|
+
raise Error.new("Too many elements!")
|
64
|
+
rescue => e
|
65
|
+
e.err
|
66
|
+
end
|
67
|
+
end
|
68
|
+
else
|
69
|
+
begin
|
70
|
+
raise Error.new("Invalid data type(s) provided.")
|
71
|
+
rescue => e
|
72
|
+
e.err
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def get_tuple_name
|
78
|
+
@tuple_name
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_value
|
82
|
+
@data
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_size
|
86
|
+
@size
|
87
|
+
end
|
88
|
+
|
89
|
+
def get(index)
|
90
|
+
if index >= @size
|
91
|
+
Error.new("Tuple index out of bounds.")
|
92
|
+
else
|
93
|
+
@data[index]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def set(index, item)
|
98
|
+
if index >= @size
|
99
|
+
Error.new("Tuple index out of bounds.")
|
100
|
+
else
|
101
|
+
data[index] = item
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def push(item)
|
106
|
+
if @data.size < @size
|
107
|
+
@data.push(item)
|
108
|
+
else
|
109
|
+
Error.new("No more space in this tuple!")
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
class CLTuple1 < CLTuple
|
117
|
+
|
118
|
+
def initialize(data)
|
119
|
+
super(1, data)
|
120
|
+
end
|
121
|
+
|
122
|
+
def get_cl_type
|
123
|
+
@cl_tuple_type = CLTuple1Type.new
|
124
|
+
@cl_tuple_type.to_string
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
class CLTuple2 < CLTuple
|
129
|
+
|
130
|
+
def initialize(data)
|
131
|
+
super(2, data)
|
132
|
+
end
|
133
|
+
|
134
|
+
def get_cl_type
|
135
|
+
@cl_tuple_type = CLTuple2Type.new
|
136
|
+
@cl_tuple_type.to_string
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
class CLTuple3 < CLTuple
|
141
|
+
|
142
|
+
def initialize(data)
|
143
|
+
super(3, data)
|
144
|
+
# puts data
|
145
|
+
end
|
146
|
+
|
147
|
+
def get_cl_type
|
148
|
+
@cl_tuple_type = CLTuple3Type.new
|
149
|
+
@cl_tuple_type.to_string
|
150
|
+
end
|
151
|
+
end
|