torigoya_kit 0.0.11 → 0.2.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/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
|