torigoya_kit 0.0.11 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/torigoya_kit/client.rb +7 -7
- data/lib/torigoya_kit/protocol.rb +63 -58
- data/lib/torigoya_kit/session.rb +27 -85
- data/lib/torigoya_kit/stream_result.rb +95 -60
- data/lib/torigoya_kit/ticket.rb +76 -154
- data/lib/torigoya_kit/typeutil.rb +46 -0
- data/lib/torigoya_kit/version.rb +1 -1
- data/spec/cases/protocol_spec.rb +24 -12
- data/spec/cases/session_spec.rb +19 -8
- data/spec/cases/ticket_spec.rb +19 -43
- data/spec/spec_helper.rb +36 -13
- data/torigoya_kit.gemspec +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb896dfb27fba5b772fb9c0b2562ca7e2dd2ccd4
|
4
|
+
data.tar.gz: 250b1853f23f08d132295b92888597d08b6af0a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96ccd817a7fed70dadce93175d78deaacee4d87d9ed231b7aaa5de293f92241665043e464473d594e82bb17230390a4de56391b2b472e5109ca39ec9de359a54
|
7
|
+
data.tar.gz: 1048f3c0cf79e25fb4b3403b7f160722482999e76af44b41eaec7ce70ab75445bbb6474a81e5634537666960ab074b6175fb8bc1a4edca73206a28d53736575e
|
data/lib/torigoya_kit/client.rb
CHANGED
@@ -12,33 +12,33 @@ module TorigoyaKit
|
|
12
12
|
|
13
13
|
####
|
14
14
|
def exec_ticket(ticket)
|
15
|
-
return
|
15
|
+
return new_session().exec_ticket(ticket)
|
16
16
|
end
|
17
17
|
|
18
18
|
def exec_ticket_with_stream(ticket, &block)
|
19
|
-
return
|
19
|
+
return new_session().exec_ticket_with_stream(ticket, &block)
|
20
20
|
end
|
21
21
|
|
22
22
|
####
|
23
23
|
def update_packages()
|
24
|
-
return
|
24
|
+
return new_session().update_packages()
|
25
25
|
end
|
26
26
|
|
27
27
|
####
|
28
28
|
def reload_proc_table()
|
29
|
-
return
|
29
|
+
return new_session().reload_proc_table()
|
30
30
|
end
|
31
31
|
|
32
32
|
def update_proc_table()
|
33
|
-
return
|
33
|
+
return new_session().update_proc_table()
|
34
34
|
end
|
35
35
|
|
36
36
|
def get_proc_table()
|
37
|
-
return
|
37
|
+
return new_session().get_proc_table()
|
38
38
|
end
|
39
39
|
|
40
40
|
private
|
41
|
-
def
|
41
|
+
def new_session()
|
42
42
|
return Session.new(@host, @port)
|
43
43
|
end
|
44
44
|
end # class Client
|
@@ -11,109 +11,114 @@ module TorigoyaKit
|
|
11
11
|
MessageKindIndexBegin = 0
|
12
12
|
|
13
13
|
# Sent from client
|
14
|
-
MessageKindAcceptRequest = 0
|
15
14
|
MessageKindTicketRequest = 1
|
16
15
|
MessageKindUpdateRepositoryRequest = 2
|
17
|
-
MessageKindReloadProcTableRequest = 3
|
18
|
-
MessageKindUpdateProcTableRequest = 4
|
19
|
-
MessageKindGetProcTableRequest = 5
|
20
16
|
|
21
17
|
# Sent from server
|
22
|
-
MessageKindAccept = 6
|
23
18
|
MessageKindOutputs = 7
|
24
19
|
MessageKindResult = 8
|
25
20
|
MessageKindSystemError = 9
|
26
21
|
MessageKindExit = 10
|
27
22
|
|
28
23
|
MessageKindSystemResult = 11
|
29
|
-
MessageKindProcTable = 12
|
30
24
|
|
31
25
|
#
|
32
|
-
MessageKindIndexEnd =
|
26
|
+
MessageKindIndexEnd = 11
|
33
27
|
MessageKindInvalid = 0xff
|
34
28
|
|
35
29
|
#
|
36
|
-
HeaderLength =
|
30
|
+
HeaderLength = 2 + 1 + 4 + 4
|
37
31
|
|
38
32
|
#
|
33
|
+
# Signature [2]byte //
|
34
|
+
# MessageKind byte //
|
35
|
+
# Version [4]byte // uint32, little endian
|
36
|
+
# Length [4]byte // uint32, little endian
|
37
|
+
# Message []byte // data, msgpacked
|
39
38
|
class Packet
|
40
|
-
|
39
|
+
Signature = "TG"
|
40
|
+
|
41
|
+
def initialize(kind, version, data)
|
41
42
|
if kind < MessageKindIndexBegin || kind > MessageKindIndexEnd
|
42
43
|
raise "invalid header"
|
43
44
|
end
|
44
45
|
|
45
|
-
@kind = [kind].pack("C*")
|
46
|
-
@
|
47
|
-
@
|
46
|
+
@kind = [kind].pack("C*") # byte
|
47
|
+
@version = [version].pack("V*") # little endian, 32bit, unsigned int
|
48
|
+
@message = data.to_msgpack # msgpacked
|
49
|
+
@length = [@message.size].pack("V*") # little endian, 32bit, unsigned int
|
48
50
|
end
|
49
|
-
attr_reader :kind, :
|
51
|
+
attr_reader :kind, :version, :message, :length
|
50
52
|
|
51
53
|
#
|
52
54
|
def to_binary
|
53
|
-
return @kind + @
|
55
|
+
return Signature + @kind + @version + @length + @message
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
57
|
-
|
58
|
-
|
59
|
-
|
59
|
+
class Frame
|
60
|
+
def initialize(kind, buffer)
|
61
|
+
@kind = kind
|
62
|
+
@raw_object = MessagePack.unpack(buffer)
|
63
|
+
end
|
64
|
+
attr_reader :kind, :raw_object
|
65
|
+
|
66
|
+
def get_object
|
67
|
+
case @kind
|
68
|
+
when MessageKindOutputs
|
69
|
+
return StreamOutputResult.from_hash(@raw_object)
|
70
|
+
when MessageKindResult
|
71
|
+
return StreamExecutedResult.from_hash(@raw_object)
|
72
|
+
when MessageKindSystemError
|
73
|
+
return StreamSystemError.new(@raw_object)
|
74
|
+
when MessageKindExit
|
75
|
+
return StreamExit.new(@raw_object)
|
76
|
+
|
77
|
+
when MessageKindSystemResult
|
78
|
+
return StreamSystemResult.new(@raw_object)
|
79
|
+
else
|
80
|
+
raise "Protocol :: Result kind(#{kind}) is not supported by clitnt side"
|
81
|
+
end
|
82
|
+
end
|
60
83
|
end
|
61
84
|
|
62
|
-
|
63
|
-
io.write(encode(kind, data))
|
85
|
+
class InvalidFrame < RuntimeError
|
64
86
|
end
|
65
87
|
|
66
|
-
|
67
|
-
results = []
|
68
|
-
decode_from_stream(io) do |r|
|
69
|
-
results << r
|
70
|
-
end
|
88
|
+
# ============================================================
|
71
89
|
|
72
|
-
|
90
|
+
def self.encode(kind, version, data)
|
91
|
+
return Packet.new(kind, version, data).to_binary
|
73
92
|
end
|
74
93
|
|
75
|
-
|
76
|
-
def self.decode(buffer)
|
94
|
+
def self.decode(buffer, expected_version)
|
77
95
|
if buffer.size >= HeaderLength
|
96
|
+
# read signature
|
97
|
+
signature = buffer[0...2]
|
98
|
+
if signature != Packet::Signature
|
99
|
+
raise InvalidFrame.new("Invalid Signature")
|
100
|
+
end
|
101
|
+
|
78
102
|
# read kind
|
79
|
-
kind = buffer[
|
103
|
+
kind = buffer[2].unpack("c")[0] # 8bit signed char
|
104
|
+
|
105
|
+
# read version
|
106
|
+
version = buffer[3...7].unpack("I")[0] # 32bit unsigned int(little endian)
|
107
|
+
if version != expected_version
|
108
|
+
raise InvalidFrame.new("Invalid Version")
|
109
|
+
end
|
80
110
|
|
81
111
|
# read length
|
82
|
-
length = buffer[
|
112
|
+
length = buffer[7...11].unpack("I")[0] # 32bit unsigned int(little endian)
|
83
113
|
|
114
|
+
# read body
|
84
115
|
if buffer.size >= HeaderLength + length
|
85
|
-
|
116
|
+
next_buffer = buffer[(HeaderLength + length)...buffer.size]
|
117
|
+
return Frame.new(kind, buffer[HeaderLength...(HeaderLength + length)]), next_buffer
|
86
118
|
end
|
87
119
|
end
|
88
120
|
|
89
|
-
return
|
90
|
-
end
|
91
|
-
|
92
|
-
def self.cat_rest(buffer, length)
|
93
|
-
return buffer[(HeaderLength + length)..buffer.size]
|
94
|
-
end
|
95
|
-
|
96
|
-
#
|
97
|
-
def self.decode_as_client(kind, decoded)
|
98
|
-
case kind
|
99
|
-
when MessageKindAccept
|
100
|
-
return StreamAccept.new
|
101
|
-
when MessageKindOutputs
|
102
|
-
return StreamOutputResult.from_tuple(decoded)
|
103
|
-
when MessageKindResult
|
104
|
-
return StreamExecutedResult.from_tuple(decoded)
|
105
|
-
when MessageKindSystemError
|
106
|
-
return StreamSystemError.from_tuple(decoded)
|
107
|
-
when MessageKindExit
|
108
|
-
return StreamExit.from_tuple(decoded)
|
109
|
-
|
110
|
-
when MessageKindSystemResult
|
111
|
-
return StreamSystemStatusResult.new(decoded)
|
112
|
-
when MessageKindProcTable
|
113
|
-
return decoded
|
114
|
-
else
|
115
|
-
raise "Protocol :: Result kind(#{kind}) is not supported by clitnt side"
|
116
|
-
end
|
121
|
+
return nil, buffer
|
117
122
|
end
|
118
123
|
|
119
124
|
end # class Protocol
|
data/lib/torigoya_kit/session.rb
CHANGED
@@ -10,7 +10,7 @@ require_relative 'protocol'
|
|
10
10
|
|
11
11
|
module TorigoyaKit
|
12
12
|
class Session
|
13
|
-
Version =
|
13
|
+
Version = 20150715
|
14
14
|
|
15
15
|
########################################
|
16
16
|
#
|
@@ -83,96 +83,52 @@ module TorigoyaKit
|
|
83
83
|
########################################
|
84
84
|
#
|
85
85
|
def exec_ticket_with_stream(ticket, &block)
|
86
|
-
|
87
|
-
read_stream(&block)
|
88
|
-
end
|
86
|
+
send(Protocol::MessageKindTicketRequest, ticket)
|
89
87
|
|
90
|
-
|
91
|
-
#
|
92
|
-
def update_packages()
|
93
|
-
write(Protocol::MessageKindUpdateRepositoryRequest)
|
94
|
-
res = read()
|
95
|
-
if res.is_a?(StreamSystemStatusResult)
|
96
|
-
return
|
97
|
-
elsif res.is_a?(StreamSystemError)
|
98
|
-
raise res.message
|
99
|
-
else
|
100
|
-
raise "Unexpected error: unknown message was recieved (#{res.class})"
|
101
|
-
end
|
88
|
+
recv_stream(&block)
|
102
89
|
end
|
103
90
|
|
104
91
|
########################################
|
105
92
|
#
|
106
|
-
def
|
107
|
-
|
108
|
-
res = read()
|
109
|
-
if res.is_a?(StreamSystemStatusResult)
|
110
|
-
return
|
111
|
-
elsif res.is_a?(StreamSystemError)
|
112
|
-
raise res.message
|
113
|
-
else
|
114
|
-
raise "Unexpected error: unknown message was recieved (#{res.class})"
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
########################################
|
119
|
-
#
|
120
|
-
def update_proc_table()
|
121
|
-
write(Protocol::MessageKindUpdateProcTableRequest)
|
122
|
-
res = read()
|
123
|
-
if res.is_a?(StreamSystemStatusResult)
|
124
|
-
return
|
125
|
-
elsif res.is_a?(StreamSystemError)
|
126
|
-
raise res.message
|
127
|
-
else
|
128
|
-
raise "Unexpected error: unknown message was recieved (#{res.class})"
|
129
|
-
end
|
130
|
-
end
|
93
|
+
def update_packages()
|
94
|
+
send(Protocol::MessageKindUpdateRepositoryRequest, nil)
|
131
95
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
raise res.message
|
141
|
-
else
|
142
|
-
raise "Unexpected error: unknown message was recieved (#{res.class})"
|
96
|
+
recv_stream() do |res|
|
97
|
+
if res.is_a?(StreamSystemResult)
|
98
|
+
return res.status
|
99
|
+
elsif res.is_a?(StreamSystemError)
|
100
|
+
raise res.message
|
101
|
+
else
|
102
|
+
raise "Unexpected error: unknown message was recieved (#{res.class})"
|
103
|
+
end
|
143
104
|
end
|
144
105
|
end
|
145
106
|
|
146
107
|
########################################
|
147
|
-
#########################################
|
148
108
|
private
|
149
109
|
|
150
110
|
########################################
|
151
111
|
#
|
152
|
-
def
|
153
|
-
accepted = false
|
112
|
+
def recv_frame_object()
|
154
113
|
is_closed = false
|
155
114
|
|
156
115
|
loop do
|
157
116
|
begin
|
158
|
-
@buffer << @socket.readpartial(
|
117
|
+
@buffer << @socket.readpartial(8096)
|
159
118
|
rescue EOFError
|
160
119
|
is_closed = true
|
161
120
|
end
|
162
121
|
|
163
|
-
|
164
|
-
|
122
|
+
frame, @buffer = Protocol.decode(@buffer, Version)
|
123
|
+
if frame.nil?
|
165
124
|
if is_closed
|
166
|
-
break
|
125
|
+
break # finish loop
|
167
126
|
else
|
168
|
-
next
|
127
|
+
next # try to read data
|
169
128
|
end
|
170
129
|
end
|
171
130
|
|
172
|
-
|
173
|
-
@buffer = Protocol.cat_rest(@buffer, length)
|
174
|
-
|
175
|
-
return Protocol.decode_as_client(kind, MessagePack.unpack(content))
|
131
|
+
return frame.get_object()
|
176
132
|
end # loop
|
177
133
|
|
178
134
|
return nil
|
@@ -180,35 +136,21 @@ module TorigoyaKit
|
|
180
136
|
|
181
137
|
########################################
|
182
138
|
#
|
183
|
-
def
|
139
|
+
def recv_stream(&block)
|
184
140
|
loop do
|
185
|
-
|
186
|
-
|
141
|
+
obj = recv_frame_object()
|
142
|
+
raise "object is empty" if obj.nil?
|
187
143
|
|
188
|
-
break if
|
189
|
-
block.call(
|
144
|
+
break if obj.is_a?(StreamExit)
|
145
|
+
block.call(obj) unless block.nil?
|
190
146
|
end
|
191
147
|
end
|
192
148
|
|
193
149
|
########################################
|
194
150
|
#
|
195
|
-
def
|
196
|
-
|
197
|
-
Protocol.encode_to(@socket, kind, *args)
|
151
|
+
def send(kind, args)
|
152
|
+
@socket.write(Protocol.encode(kind, Version, args))
|
198
153
|
end
|
199
154
|
|
200
|
-
########################################
|
201
|
-
#
|
202
|
-
def expect_accepted_by_server
|
203
|
-
Protocol.encode_to(@socket, Protocol::MessageKindAcceptRequest, Version)
|
204
|
-
res = read()
|
205
|
-
if res.is_a?(StreamAccept)
|
206
|
-
return
|
207
|
-
elsif res.is_a?(StreamSystemError)
|
208
|
-
raise res.message
|
209
|
-
else
|
210
|
-
raise "Unexpected error: unknown message was recieved"
|
211
|
-
end
|
212
|
-
end
|
213
155
|
end # class Session
|
214
156
|
end # module TorigoyaKit
|
@@ -1,6 +1,8 @@
|
|
1
|
-
# Copyright (c) 2014 yutopp
|
1
|
+
# Copyright (c) 2014 - 2015 yutopp
|
2
2
|
# Licenced under the MIT License (http://www.opensource.org/licenses/mit-license.php)
|
3
3
|
|
4
|
+
require_relative 'typeutil'
|
5
|
+
|
4
6
|
module TorigoyaKit
|
5
7
|
class ResultMode
|
6
8
|
CompileMode = 0
|
@@ -8,10 +10,6 @@ module TorigoyaKit
|
|
8
10
|
RunMode = 2
|
9
11
|
end
|
10
12
|
|
11
|
-
#
|
12
|
-
class StreamAccept
|
13
|
-
end
|
14
|
-
|
15
13
|
#
|
16
14
|
class StreamOutput
|
17
15
|
StdoutFd = 0
|
@@ -20,19 +18,24 @@ module TorigoyaKit
|
|
20
18
|
def initialize(fd, buffer)
|
21
19
|
@fd = fd
|
22
20
|
@buffer = buffer
|
21
|
+
|
22
|
+
validate
|
23
23
|
end
|
24
24
|
attr_reader :fd, :buffer
|
25
25
|
|
26
|
-
def self.
|
27
|
-
|
28
|
-
raise "invalid format(tuple size is different [expected 2 but #{tupled.size}] :: #{self})" unless tupled.size == 2
|
29
|
-
|
30
|
-
return StreamOutput.new(tupled[0], tupled[1])
|
26
|
+
def self.from_hash(hash)
|
27
|
+
return StreamOutput.new(hash["fd"], hash["buffer"])
|
31
28
|
end
|
32
29
|
|
33
30
|
def to_s
|
34
31
|
return "#{self.class}/[#{@fd} #{@buffer}]"
|
35
32
|
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def validate()
|
36
|
+
TypeUtil.nonnull_type_check(self, "fd", @fd, Integer)
|
37
|
+
TypeUtil.nonnull_type_check(self, "buffer", @buffer, String)
|
38
|
+
end
|
36
39
|
end
|
37
40
|
|
38
41
|
# related to MessageKindOutputs
|
@@ -41,53 +44,76 @@ module TorigoyaKit
|
|
41
44
|
@mode = mode
|
42
45
|
@index = index
|
43
46
|
@output = output
|
47
|
+
|
48
|
+
validate
|
44
49
|
end
|
45
50
|
attr_reader :mode, :index, :output
|
46
51
|
|
47
|
-
def self.
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
StreamOutput.from_tuple(tupled[2])
|
54
|
-
)
|
52
|
+
def self.from_hash(hash)
|
53
|
+
return StreamOutputResult.new(
|
54
|
+
hash["mode"],
|
55
|
+
hash["index"],
|
56
|
+
StreamOutput.from_hash(hash["output"])
|
57
|
+
)
|
55
58
|
end
|
56
59
|
|
57
60
|
def to_s
|
58
61
|
return "#{self.class}/[#{@mode} #{@index} #{@output.to_s}]"
|
59
62
|
end
|
63
|
+
|
64
|
+
private
|
65
|
+
def validate()
|
66
|
+
TypeUtil.nonnull_type_check(self, "mode", @mode, Integer)
|
67
|
+
TypeUtil.nonnull_type_check(self, "index", @index, Integer)
|
68
|
+
TypeUtil.nonnull_type_check(self, "output", @output, StreamOutput)
|
69
|
+
end
|
60
70
|
end
|
61
71
|
|
62
72
|
#
|
63
73
|
class ExecutedResult
|
64
|
-
def initialize(
|
74
|
+
def initialize(exited, exit_status, signaled, signal, cpu_time, memory, s_es, s_em)
|
75
|
+
@exited = exited
|
76
|
+
@exit_status = exit_status
|
77
|
+
@signaled = signaled
|
78
|
+
@signal = signal
|
79
|
+
|
65
80
|
@used_cpu_time_sec = cpu_time
|
66
81
|
@used_memory_bytes = memory
|
67
|
-
@signal = signal
|
68
|
-
@return_code = return_code
|
69
|
-
@command_line = command_line
|
70
|
-
@status = status
|
71
|
-
@system_error_message = error_message
|
72
|
-
end
|
73
|
-
attr_reader :used_cpu_time_sec, :used_memory_bytes, :signal, :return_code, :command_line, :status, :system_error_message
|
74
82
|
|
75
|
-
|
76
|
-
|
77
|
-
raise "invalid format(tuple size is different [expected 7 but #{tupled.size}] :: #{self})" unless tupled.size == 7
|
83
|
+
@system_error_status = s_es
|
84
|
+
@system_error_message = s_em
|
78
85
|
|
79
|
-
|
80
|
-
tupled[1],
|
81
|
-
tupled[2],
|
82
|
-
tupled[3],
|
83
|
-
tupled[4],
|
84
|
-
tupled[5],
|
85
|
-
tupled[6]
|
86
|
-
)
|
86
|
+
validate
|
87
87
|
end
|
88
|
+
attr_reader :exited, :exit_status, :signaled, :signal
|
89
|
+
attr_reader :used_cpu_time_sec, :used_memory_bytes
|
90
|
+
attr_reader :system_error_status, :system_error_message
|
88
91
|
|
89
|
-
def
|
90
|
-
return
|
92
|
+
def self.from_hash(hash)
|
93
|
+
return ExecutedResult.new(
|
94
|
+
hash["exited"],
|
95
|
+
hash["exit_status"],
|
96
|
+
hash["signaled"],
|
97
|
+
hash["signal"],
|
98
|
+
hash["used_cpu_time_sec"],
|
99
|
+
hash["used_memory_bytes"],
|
100
|
+
hash["system_error_status"],
|
101
|
+
hash["system_error_message"],
|
102
|
+
)
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
def validate()
|
107
|
+
TypeUtil.nonnull_boolean_type_check(self, "exited", @exited)
|
108
|
+
TypeUtil.nonnull_type_check(self, "exit_status", @exit_status, Integer)
|
109
|
+
TypeUtil.nonnull_boolean_type_check(self, "signaled", @signaled)
|
110
|
+
TypeUtil.nonnull_type_check(self, "signal", @signal, Integer)
|
111
|
+
|
112
|
+
TypeUtil.nonnull_type_check(self, "used_cpu_time_sec", @used_cpu_time_sec, Float)
|
113
|
+
TypeUtil.nonnull_type_check(self, "used_memory_bytes", @used_memory_bytes, Integer)
|
114
|
+
|
115
|
+
TypeUtil.nonnull_type_check(self, "system_error_status", @system_error_status, Integer)
|
116
|
+
TypeUtil.nonnull_type_check(self, "system_error_message", @system_error_message, String)
|
91
117
|
end
|
92
118
|
end
|
93
119
|
|
@@ -97,62 +123,71 @@ module TorigoyaKit
|
|
97
123
|
@mode = mode
|
98
124
|
@index = index
|
99
125
|
@result = result
|
126
|
+
|
127
|
+
validate
|
100
128
|
end
|
101
129
|
attr_reader :mode, :index, :result
|
102
130
|
|
103
|
-
def self.
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
ExecutedResult.from_tuple(tupled[2])
|
110
|
-
)
|
131
|
+
def self.from_hash(hash)
|
132
|
+
return StreamExecutedResult.new(
|
133
|
+
hash["mode"],
|
134
|
+
hash["index"],
|
135
|
+
ExecutedResult.from_hash(hash["result"])
|
136
|
+
)
|
111
137
|
end
|
112
138
|
|
113
139
|
def to_s
|
114
140
|
return "#{self.class}/[#{@mode} #{@index} #{@result.to_s}]"
|
115
141
|
end
|
142
|
+
|
143
|
+
private
|
144
|
+
def validate()
|
145
|
+
TypeUtil.nonnull_type_check(self, "mode", @mode, Integer)
|
146
|
+
TypeUtil.nonnull_type_check(self, "index", @index, Integer)
|
147
|
+
TypeUtil.nonnull_type_check(self, "result", @result, ExecutedResult)
|
148
|
+
end
|
116
149
|
end
|
117
150
|
|
118
151
|
# related to MessageKindSystemError
|
119
152
|
class StreamSystemError
|
120
153
|
def initialize(message)
|
121
154
|
@message = message
|
122
|
-
end
|
123
|
-
attr_reader :message
|
124
|
-
|
125
|
-
def self.from_tuple(message)
|
126
|
-
raise "type error [expected String but #{message.class}] :: #{self}" unless message.is_a?(String)
|
127
155
|
|
128
|
-
|
156
|
+
validate
|
129
157
|
end
|
158
|
+
attr_reader :message
|
130
159
|
|
131
160
|
def to_s
|
132
161
|
return "#{self.class}/[#{@message}]"
|
133
162
|
end
|
163
|
+
|
164
|
+
private
|
165
|
+
def validate()
|
166
|
+
TypeUtil.nonnull_type_check(self, "message", @message, String)
|
167
|
+
end
|
134
168
|
end
|
135
169
|
|
136
170
|
# related to MessageKindExit
|
137
171
|
class StreamExit
|
138
172
|
def initialize(message)
|
139
173
|
@message = message
|
140
|
-
end
|
141
|
-
attr_reader :message
|
142
174
|
|
143
|
-
|
144
|
-
raise "type error [expected String but #{message.class}] :: #{self}" unless message.is_a?(String)
|
145
|
-
|
146
|
-
return StreamExit.new(message)
|
175
|
+
validate
|
147
176
|
end
|
177
|
+
attr_reader :message
|
148
178
|
|
149
179
|
def to_s
|
150
180
|
return "#{self.class}/[#{@message}]"
|
151
181
|
end
|
182
|
+
|
183
|
+
private
|
184
|
+
def validate()
|
185
|
+
TypeUtil.nonnull_type_check(self, "message", @message, String)
|
186
|
+
end
|
152
187
|
end
|
153
188
|
|
154
189
|
#
|
155
|
-
class
|
190
|
+
class StreamSystemResult
|
156
191
|
def initialize(status)
|
157
192
|
@status = status
|
158
193
|
end
|