test_sdk1 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|