rom-core 4.0.0.beta1 → 4.0.0.beta2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef15d608c1f83a62e5fda73922905f3ea6b4ac64
4
- data.tar.gz: 0756e26ace05072f5717d47f7738e21a43e322c7
3
+ metadata.gz: 9ea3d114fd7800efddd98a8efe19a01586625c9f
4
+ data.tar.gz: 59a3cc776cfd019cd54583caf4ef8ee759d90f09
5
5
  SHA512:
6
- metadata.gz: 46aecaac6f9e294a7acbadd9dcd5b5c56a2b08a4bd62e15b6d408089b1ab130149a7f9d02000d78b83ed41947d0e04648be6ae30c6591428db59e3b84615d2c1
7
- data.tar.gz: 8f6c5783b58df407395d2c25e1b3389c4b011d49922a9c73cd2f8e613c7464ce5122a03ddccc4311844e28adeac37e5893fcbc893277cb93805cdecd47a71aa3
6
+ metadata.gz: 4349071ed68f65de26faf701b930653f56be802e14f63b82510d04c091ad0a7d0687eb23bb0e6a22b6330d6f83ec32184811701d29cd41934140d10c00ec54e6
7
+ data.tar.gz: 31885902cc6c78cf78c2f1357ee76edcf082eea550deaa293588029534a68e09d01c6a31ef14bd7e09523ad7678344184b2e3eec8f384a767ff11c94f5948f1f
@@ -28,6 +28,8 @@ Previous `rom` gem was renamed to `rom-core`
28
28
  * [BREAKING] `Relation#as` now returns a new relation with aliased name, use `Relation#map_with(*list-of-mapper-ids)` or `Relation#map_to(model)` if you just want to map to custom models (solnic)
29
29
  * [BREAKING] `Relation.register_as(:bar)` is removed in favor of `schema(:foo, as: :bar)` (solnic)
30
30
  * [BREAKING] `Relation.dataset(:foo)` is removed in favor of `schema(:foo)`. Passing a block still works like before (solnic)
31
+ * [BREAKING] `CommandRegistry#try` is removed (solnic)
32
+ * [BREAKING] `Command#with` changed behavior, use `Command#curry` instead (solnic)
31
33
  * Separation between relations that are standalone or registrable in a registry is gone. All relations have names and schemas now.
32
34
  They are automatically set to defaults. In practice this means you can instantiate a relation object manually and it'll Just Work (solnic)
33
35
  * Mapper and command objects are cached locally within a given rom container (solnic)
@@ -23,13 +23,14 @@ module ROM
23
23
  #
24
24
  # @api public
25
25
  class Command
26
+ extend Dry::Core::ClassAttributes
26
27
  extend Initializer
28
+ extend ClassInterface
29
+
27
30
  include Dry::Equalizer(:relation, :options)
28
31
  include Commands
29
32
  include Pipeline::Operator
30
33
 
31
- extend Dry::Core::ClassAttributes
32
- extend ClassInterface
33
34
 
34
35
  # @!method self.adapter
35
36
  # Get or set adapter identifier
@@ -316,7 +317,6 @@ module ROM
316
317
  self.class.build(relation, **options, curry_args: args)
317
318
  end
318
319
  end
319
- alias_method :with, :curry
320
320
 
321
321
  # Compose this command with other commands
322
322
  #
@@ -338,17 +338,6 @@ module ROM
338
338
  curry_args.size > 0
339
339
  end
340
340
 
341
- # Return a new command with new options
342
- #
343
- # @param [Hash] new_opts A hash with new options
344
- #
345
- # @return [Command]
346
- #
347
- # @api public
348
- def with_opts(new_opts)
349
- self.class.new(relation, options.merge(new_opts))
350
- end
351
-
352
341
  # Return a new command with appended before hooks
353
342
  #
354
343
  # @param [Array<Hash>] hooks A list of before hooks configurations
@@ -2,15 +2,12 @@ require 'concurrent/map'
2
2
 
3
3
  require 'rom/constants'
4
4
  require 'rom/registry'
5
- require 'rom/commands/result'
6
5
 
7
6
  module ROM
8
7
  # Specialized registry class for commands
9
8
  #
10
9
  # @api public
11
10
  class CommandRegistry < Registry
12
- include Commands
13
-
14
11
  # Internal command registry
15
12
  #
16
13
  # @return [Registry]
@@ -35,31 +32,6 @@ module ROM
35
32
  CommandNotFoundError
36
33
  end
37
34
 
38
- # Try to execute a command in a block
39
- #
40
- # @yield [command] Passes command to the block
41
- #
42
- # @example
43
- #
44
- # rom.commands[:users].try { create(name: 'Jane') }
45
- # rom.commands[:users].try { update(:by_id, 1).call(name: 'Jane Doe') }
46
- # rom.commands[:users].try { delete(:by_id, 1) }
47
- #
48
- # @return [Commands::Result]
49
- #
50
- # @api public
51
- def try(&block)
52
- response = block.call
53
-
54
- if response.is_a?(Command) || response.is_a?(Composite)
55
- try { response.call }
56
- else
57
- Result::Success.new(response)
58
- end
59
- rescue CommandError => e
60
- Result::Failure.new(e)
61
- end
62
-
63
35
  # Return a command from the registry
64
36
  #
65
37
  # If mapper is set command will be turned into a composite command with
@@ -39,8 +39,8 @@ module ROM
39
39
  # create_task = rom.commands[:tasks].create
40
40
  #
41
41
  # command = create_user
42
- # .with(name: 'Jane')
43
- # .combine(create_task.with(title: 'Task'))
42
+ # .curry(name: 'Jane')
43
+ # .combine(create_task.curry(title: 'Task'))
44
44
  #
45
45
  # command.call
46
46
  #
@@ -44,7 +44,7 @@ module ROM
44
44
  tuple_path = Array[*path] << key
45
45
  input_proc = InputEvaluator.build(tuple_path, nodes)
46
46
 
47
- command = command.with(input_proc, opts)
47
+ command = command.curry(input_proc, opts)
48
48
 
49
49
  if nodes
50
50
  if nodes.all? { |node| node.is_a?(Array) }
@@ -15,7 +15,7 @@ require 'rom/command_registry'
15
15
  require 'rom/relation/loaded'
16
16
  require 'rom/relation/curried'
17
17
  require 'rom/relation/composite'
18
- require 'rom/relation/graph'
18
+ require 'rom/relation/combined'
19
19
  require 'rom/relation/wrap'
20
20
  require 'rom/relation/materializable'
21
21
  require 'rom/relation/commands'
@@ -172,17 +172,6 @@ module ROM
172
172
  end
173
173
  end
174
174
 
175
- # Composes with other relations
176
- #
177
- # @param [Array<Relation>] others The other relation(s) to compose with
178
- #
179
- # @return [Relation::Graph]
180
- #
181
- # @api public
182
- def graph(*others)
183
- Graph.build(self, others)
184
- end
185
-
186
175
  # Combine with other relations
187
176
  #
188
177
  # @overload combine(*associations)
@@ -196,21 +185,34 @@ module ROM
196
185
  #
197
186
  # @api public
198
187
  def combine(*args)
199
- graph(*nodes(*args))
188
+ combine_with(*nodes(*args))
189
+ end
190
+
191
+ # Composes with other relations
192
+ #
193
+ # @param [Array<Relation>] others The other relation(s) to compose with
194
+ #
195
+ # @return [Relation::Graph]
196
+ #
197
+ # @api public
198
+ def combine_with(*others)
199
+ Combined.new(self, others)
200
200
  end
201
201
 
202
202
  # @api private
203
203
  def nodes(*args)
204
- args.map do |arg|
204
+ args.reduce([]) do |acc, arg|
205
205
  case arg
206
206
  when Symbol
207
- node(arg)
207
+ acc << node(arg)
208
208
  when Hash
209
- arg.reduce(self) { |r, (k, v)| r.node(k).combine(*v) }
209
+ acc << arg.reduce(self) do |root, (name, *opts)|
210
+ root.node(name).combine(*opts)
211
+ end
210
212
  when Array
211
- arg.map { |opts| nodes(opts) }
213
+ acc.concat(arg.map { |opts| nodes(opts) }.reduce(:concat))
212
214
  end
213
- end.flatten(0)
215
+ end
214
216
  end
215
217
 
216
218
  # @api public
@@ -236,18 +238,27 @@ module ROM
236
238
  assoc.preload(self, other)
237
239
  end
238
240
 
239
- # Wrap other relations
241
+ # Wrap other relations using association names
240
242
  #
241
243
  # @example
242
244
  # tasks.wrap(:owner)
243
245
  #
244
246
  # @param [Hash] options
245
247
  #
246
- # @return [RelationProxy]
248
+ # @return [Relation]
247
249
  #
248
250
  # @api public
249
251
  def wrap(*names)
250
- wrap_class.new(self, names.map { |n| associations[n].wrap })
252
+ wrap_around(*names.map { |n| associations[n].wrap })
253
+ end
254
+
255
+ # Wrap around other relations
256
+ #
257
+ # @return [Relation::Wrap]
258
+ #
259
+ # @api public
260
+ def wrap_around(*others)
261
+ wrap_class.new(self, others)
251
262
  end
252
263
 
253
264
  # Loads relation
@@ -431,7 +442,7 @@ module ROM
431
442
  #
432
443
  # @param [Array<Symbol>] mappers A list of mapper identifiers
433
444
  #
434
- # @return [RelationProxy] A new relation proxy with pipelined relation
445
+ # @return [Relation] A new relation proxy with pipelined relation
435
446
  #
436
447
  # @api public
437
448
  def map_with(*names, **opts)
@@ -95,15 +95,15 @@ module ROM
95
95
 
96
96
  @relation_name = Name[relation, ds_name]
97
97
 
98
- dsl = schema_dsl.new(
99
- relation_name,
100
- schema_class: schema_class,
101
- attr_class: schema_attr_class,
102
- inferrer: schema_inferrer.with(enabled: infer),
103
- &block
104
- )
105
-
106
- @schema_proc = dsl.method(:call).to_proc
98
+ @schema_proc = proc do |*args, &inner_block|
99
+ schema_dsl.new(
100
+ relation_name,
101
+ schema_class: schema_class,
102
+ attr_class: schema_attr_class,
103
+ inferrer: schema_inferrer.with(enabled: infer),
104
+ &block
105
+ ).call(*args, &inner_block)
106
+ end
107
107
  end
108
108
  end
109
109
 
@@ -0,0 +1,116 @@
1
+ require 'rom/relation/graph'
2
+ require 'rom/relation/commands'
3
+
4
+ module ROM
5
+ class Relation
6
+ # Represents a relation graphs which combines root relation
7
+ # with other relation nodes
8
+ #
9
+ # @api public
10
+ class Combined < Graph
11
+ include Commands
12
+
13
+ # Create a new relation combined with others
14
+ #
15
+ # @param [Relation] root
16
+ # @param [Array<Relation>] nodes
17
+ #
18
+ # @return [Combined]
19
+ #
20
+ # @api public
21
+ def self.new(root, nodes)
22
+ root_ns = root.options[:struct_namespace]
23
+ super(root, nodes.map { |node| node.struct_namespace(root_ns) })
24
+ end
25
+
26
+ # Combine this graph with more nodes
27
+ #
28
+ # @param [Array<Relation::Lazy>]
29
+ #
30
+ # @return [Graph]
31
+ #
32
+ # @api public
33
+ def combine_with(*others)
34
+ self.class.new(root, nodes + others)
35
+ end
36
+
37
+ # @api public
38
+ # @see Relation#combine
39
+ def combine(*args)
40
+ self.class.new(root, nodes + root.combine(*args).nodes)
41
+ end
42
+
43
+ # Materialize combined relation
44
+ #
45
+ # @return [Loaded]
46
+ #
47
+ # @api public
48
+ def call(*args)
49
+ left = root.with(auto_struct: false).call(*args)
50
+
51
+ right =
52
+ if left.empty?
53
+ nodes.map { |node| Loaded.new(node, EMPTY_ARRAY) }
54
+ else
55
+ nodes.map { |node| node.call(left) }
56
+ end
57
+
58
+ if auto_map?
59
+ Loaded.new(self, mapper.([left, right]))
60
+ else
61
+ Loaded.new(self, [left, right])
62
+ end
63
+ end
64
+
65
+ # Return a new combined relation with adjusted node returned from a block
66
+ #
67
+ # @example with a node identifier
68
+ # aggregate(:tasks).node(:tasks) { |tasks| tasks.prioritized }
69
+ #
70
+ # @example with a nested path
71
+ # aggregate(tasks: :tags).node(tasks: :tags) { |tags| tags.where(name: 'red') }
72
+ #
73
+ # @param [Symbol] name The node relation name
74
+ #
75
+ # @yieldparam [Relation] The relation node
76
+ # @yieldreturn [Relation] The new relation node
77
+ #
78
+ # @return [Relation]
79
+ #
80
+ # @api public
81
+ def node(name, &block)
82
+ if name.is_a?(Symbol) && !nodes.map { |n| n.name.key }.include?(name)
83
+ raise ArgumentError, "#{name.inspect} is not a valid aggregate node name"
84
+ end
85
+
86
+ new_nodes = nodes.map { |node|
87
+ case name
88
+ when Symbol
89
+ name == node.name.key ? yield(node) : node
90
+ when Hash
91
+ other, *rest = name.flatten(1)
92
+ if other == node.name.key
93
+ nodes.detect { |n| n.name.key == other }.node(*rest, &block)
94
+ else
95
+ node
96
+ end
97
+ else
98
+ node
99
+ end
100
+ }
101
+
102
+ with_nodes(new_nodes)
103
+ end
104
+
105
+ # @api public
106
+ def to_ast
107
+ [:relation, [name.to_sym, attr_ast + node_ast, meta_ast]]
108
+ end
109
+
110
+ # @api private
111
+ def node_ast
112
+ nodes.map(&:to_ast)
113
+ end
114
+ end
115
+ end
116
+ end
@@ -1,3 +1,5 @@
1
+ require 'dry/equalizer'
2
+
1
3
  require 'rom/types'
2
4
  require 'rom/initializer'
3
5
  require 'rom/pipeline'
@@ -9,6 +11,7 @@ module ROM
9
11
  class Curried
10
12
  extend Initializer
11
13
 
14
+ include Dry::Equalizer(:relation, :options)
12
15
  include Materializable
13
16
  include Pipeline
14
17
 
@@ -1,45 +1,39 @@
1
+ require 'dry/equalizer'
2
+
3
+ require 'rom/initializer'
4
+
1
5
  require 'rom/relation/loaded'
2
6
  require 'rom/relation/composite'
3
7
  require 'rom/relation/materializable'
4
- require 'rom/relation/commands'
5
8
  require 'rom/pipeline'
6
9
 
7
10
  module ROM
8
11
  class Relation
9
- # Compose relations using join-keys
10
- #
11
- # @example
12
- # class Users < ROM::Relation[:memory]
13
- # end
14
- #
15
- # class Tasks < ROM::Relation[:memory]
16
- # def for_users(users)
17
- # restrict(user: users.map { |user| user[:name] })
18
- # end
19
- # end
20
- #
21
- # rom.relations[:users] << { name: 'Jane' }
22
- # rom.relations[:tasks] << { user: 'Jane', title: 'Do something' }
23
- #
24
- # rom.relations[:users].combine(rom.relations[:tasks].for_users)
12
+ # Abstract relation graph class
25
13
  #
26
14
  # @api public
27
15
  class Graph
16
+ extend Initializer
17
+
18
+ param :root
19
+
20
+ param :nodes
21
+
22
+ include Dry::Equalizer(:root, :nodes)
28
23
  include Materializable
29
- include Commands
30
24
  include Pipeline
31
25
  include Pipeline::Proxy
32
26
 
33
27
  # Root aka parent relation
34
28
  #
35
- # @return [Relation::Lazy]
29
+ # @return [Relation]
36
30
  #
37
31
  # @api private
38
32
  attr_reader :root
39
33
 
40
34
  # Child relation nodes
41
35
  #
42
- # @return [Array<Relation::Lazy>]
36
+ # @return [Array<Relation>]
43
37
  #
44
38
  # @api private
45
39
  attr_reader :nodes
@@ -47,23 +41,6 @@ module ROM
47
41
  alias_method :left, :root
48
42
  alias_method :right, :nodes
49
43
 
50
- # @api private
51
- def self.build(root, nodes)
52
- if nodes.any? { |node| node.instance_of?(Composite) }
53
- raise UnsupportedRelationError,
54
- "Combining with composite relations is not supported"
55
- else
56
- new(root, nodes)
57
- end
58
- end
59
-
60
- # @api private
61
- def initialize(root, nodes)
62
- root_ns = root.options[:struct_namespace]
63
- @root = root
64
- @nodes = nodes.map { |node| node.struct_namespace(root_ns) }
65
- end
66
-
67
44
  # @api public
68
45
  def with_nodes(nodes)
69
46
  self.class.new(root, nodes)
@@ -78,44 +55,6 @@ module ROM
78
55
  true
79
56
  end
80
57
 
81
- # Combine this graph with more nodes
82
- #
83
- # @param [Array<Relation::Lazy>]
84
- #
85
- # @return [Graph]
86
- #
87
- # @api public
88
- def graph(*others)
89
- self.class.new(root, nodes + others)
90
- end
91
-
92
- # @api public
93
- def combine(*args)
94
- self.class.new(root, nodes + root.combine(*args).nodes)
95
- end
96
-
97
- # Materialize this relation graph
98
- #
99
- # @return [Loaded]
100
- #
101
- # @api public
102
- def call(*args)
103
- left = root.with(auto_struct: false).call(*args)
104
-
105
- right =
106
- if left.empty?
107
- nodes.map { |node| Loaded.new(node, EMPTY_ARRAY) }
108
- else
109
- nodes.map { |node| node.call(left) }
110
- end
111
-
112
- if auto_map?
113
- Loaded.new(self, mapper.([left, right]))
114
- else
115
- Loaded.new(self, [left, right])
116
- end
117
- end
118
-
119
58
  # @api public
120
59
  def map_with(*args)
121
60
  self.class.new(root.map_with(*args), nodes)
@@ -126,56 +65,6 @@ module ROM
126
65
  self.class.new(root.map_to(klass), nodes)
127
66
  end
128
67
 
129
- # Return a new graph with adjusted node returned from a block
130
- #
131
- # @example with a node identifier
132
- # aggregate(:tasks).node(:tasks) { |tasks| tasks.prioritized }
133
- #
134
- # @example with a nested path
135
- # aggregate(tasks: :tags).node(tasks: :tags) { |tags| tags.where(name: 'red') }
136
- #
137
- # @param [Symbol] name The node relation name
138
- #
139
- # @yieldparam [RelationProxy] The relation node
140
- # @yieldreturn [RelationProxy] The new relation node
141
- #
142
- # @return [RelationProxy]
143
- #
144
- # @api public
145
- def node(name, &block)
146
- if name.is_a?(Symbol) && !nodes.map { |n| n.name.key }.include?(name)
147
- raise ArgumentError, "#{name.inspect} is not a valid aggregate node name"
148
- end
149
-
150
- new_nodes = nodes.map { |node|
151
- case name
152
- when Symbol
153
- name == node.name.key ? yield(node) : node
154
- when Hash
155
- other, *rest = name.flatten(1)
156
- if other == node.name.key
157
- nodes.detect { |n| n.name.key == other }.node(*rest, &block)
158
- else
159
- node
160
- end
161
- else
162
- node
163
- end
164
- }
165
-
166
- with_nodes(new_nodes)
167
- end
168
-
169
- # @api public
170
- def to_ast
171
- [:relation, [name.to_sym, attr_ast + node_ast, meta_ast]]
172
- end
173
-
174
- # @api private
175
- def node_ast
176
- nodes.map(&:to_ast)
177
- end
178
-
179
68
  # @api private
180
69
  def mapper
181
70
  mappers[to_ast]
@@ -1,3 +1,5 @@
1
+ require 'dry/equalizer'
2
+
1
3
  module ROM
2
4
  class Relation
3
5
  # Materializes a relation and exposes interface to access the data
@@ -5,6 +7,7 @@ module ROM
5
7
  # @api public
6
8
  class Loaded
7
9
  include Enumerable
10
+ include Dry::Equalizer(:source, :collection)
8
11
 
9
12
  # Coerce loaded relation to an array
10
13
  #
@@ -1,15 +1,11 @@
1
- require 'rom/initializer'
2
- require 'rom/relation/loaded'
3
- require 'rom/relation/composite'
4
- require 'rom/relation/materializable'
5
- require 'rom/pipeline'
1
+ require 'rom/relation/graph'
6
2
 
7
3
  module ROM
8
4
  class Relation
9
5
  # Relation wrapping other relations
10
6
  #
11
7
  # @api public
12
- class Wrap
8
+ class Wrap < Graph
13
9
  extend Initializer
14
10
 
15
11
  include Materializable
@@ -58,11 +54,6 @@ module ROM
58
54
  nodes.map(&:to_ast)
59
55
  end
60
56
 
61
- # @api private
62
- def mapper
63
- mappers[to_ast]
64
- end
65
-
66
57
  # Return if this is a wrap relation
67
58
  #
68
59
  # @return [true]
@@ -71,13 +62,6 @@ module ROM
71
62
  def wrap?
72
63
  true
73
64
  end
74
-
75
- private
76
-
77
- # @api private
78
- def decorate?(other)
79
- super || other.is_a?(Composite) || other.is_a?(Curried)
80
- end
81
65
  end
82
66
  end
83
67
  end
@@ -1,5 +1,5 @@
1
1
  module ROM
2
2
  module Core
3
- VERSION = '4.0.0.beta1'.freeze
3
+ VERSION = '4.0.0.beta2'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.beta1
4
+ version: 4.0.0.beta2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-30 00:00:00.000000000 Z
11
+ date: 2017-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -180,7 +180,6 @@ files:
180
180
  - lib/rom/commands/lazy/create.rb
181
181
  - lib/rom/commands/lazy/delete.rb
182
182
  - lib/rom/commands/lazy/update.rb
183
- - lib/rom/commands/result.rb
184
183
  - lib/rom/commands/update.rb
185
184
  - lib/rom/configuration.rb
186
185
  - lib/rom/configuration_dsl.rb
@@ -230,6 +229,7 @@ files:
230
229
  - lib/rom/registry.rb
231
230
  - lib/rom/relation.rb
232
231
  - lib/rom/relation/class_interface.rb
232
+ - lib/rom/relation/combined.rb
233
233
  - lib/rom/relation/commands.rb
234
234
  - lib/rom/relation/composite.rb
235
235
  - lib/rom/relation/curried.rb
@@ -1,96 +0,0 @@
1
- module ROM
2
- module Commands
3
- # Abstract result class for success and error results
4
- #
5
- # @api public
6
- class Result
7
- # Return command execution result
8
- #
9
- # @api public
10
- attr_reader :value
11
-
12
- # Return potential command execution result error
13
- #
14
- # @api public
15
- attr_reader :error
16
-
17
- # Coerce result to an array
18
- #
19
- # @abstract
20
- #
21
- # @api public
22
- def to_ary
23
- raise NotImplementedError
24
- end
25
- alias_method :to_a, :to_ary
26
-
27
- # Return true if command successful
28
- #
29
- # @api public
30
- def success?
31
- is_a?(Success)
32
- end
33
-
34
- # Return true if command failed
35
- #
36
- # @api public
37
- def failure?
38
- is_a?(Failure)
39
- end
40
-
41
- # Success result has a value and no error
42
- #
43
- # @api public
44
- class Success < Result
45
- # @api private
46
- def initialize(value)
47
- @value = value.is_a?(self.class) ? value.value : value
48
- end
49
-
50
- # Call next command on continuation
51
- #
52
- # @api public
53
- def >(other)
54
- other.call(value)
55
- end
56
-
57
- # Return the value
58
- #
59
- # @return [Array]
60
- #
61
- # @api public
62
- def to_ary
63
- value.to_ary
64
- end
65
- end
66
-
67
- # Failure result has an error and no value
68
- #
69
- # @api public
70
- class Failure < Result
71
- # @api private
72
- def initialize(error)
73
- @error = error
74
- end
75
-
76
- # Do not call next command on continuation
77
- #
78
- # @return [self]
79
- #
80
- # @api public
81
- def >(_other)
82
- self
83
- end
84
-
85
- # Return the error
86
- #
87
- # @return [Array<CommandError>]
88
- #
89
- # @api public
90
- def to_ary
91
- error
92
- end
93
- end
94
- end
95
- end
96
- end