bcdd-result 0.13.0 → 1.1.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/.rubocop.yml +4 -4
- data/CHANGELOG.md +61 -21
- data/README.md +397 -227
- data/Rakefile +1 -1
- data/Steepfile +1 -1
- data/examples/multiple_listeners/Rakefile +8 -8
- data/examples/multiple_listeners/app/models/account/owner_creation.rb +1 -1
- data/examples/multiple_listeners/app/models/user/creation.rb +1 -1
- data/examples/multiple_listeners/app/models/user/token/creation.rb +1 -1
- data/examples/multiple_listeners/config/initializers/bcdd.rb +0 -2
- data/examples/multiple_listeners/config.rb +3 -3
- data/examples/multiple_listeners/db/setup.rb +2 -3
- data/examples/multiple_listeners/lib/bcdd/result/event_logs_record.rb +27 -0
- data/examples/multiple_listeners/lib/event_logs_listener/stdout.rb +60 -0
- data/examples/multiple_listeners/lib/runtime_breaker.rb +1 -1
- data/examples/service_objects/Rakefile +36 -0
- data/examples/service_objects/app/models/account/member.rb +10 -0
- data/examples/service_objects/app/models/account.rb +11 -0
- data/examples/service_objects/app/models/user/token.rb +7 -0
- data/examples/service_objects/app/models/user.rb +15 -0
- data/examples/service_objects/app/services/account/owner_creation.rb +47 -0
- data/examples/service_objects/app/services/application_service.rb +79 -0
- data/examples/service_objects/app/services/user/creation.rb +56 -0
- data/examples/service_objects/app/services/user/token/creation.rb +37 -0
- data/examples/service_objects/config/boot.rb +17 -0
- data/examples/service_objects/config/initializers/bcdd.rb +9 -0
- data/examples/service_objects/config.rb +20 -0
- data/examples/service_objects/db/setup.rb +49 -0
- data/examples/single_listener/Rakefile +5 -5
- data/examples/single_listener/app/models/account/owner_creation.rb +1 -1
- data/examples/single_listener/app/models/user/creation.rb +1 -1
- data/examples/single_listener/app/models/user/token/creation.rb +1 -1
- data/examples/single_listener/config/initializers/bcdd.rb +0 -2
- data/examples/single_listener/config.rb +1 -1
- data/examples/single_listener/lib/{single_transitions_listener.rb → single_event_logs_listener.rb} +32 -23
- data/lib/bcdd/{result/context → context}/callable_and_then.rb +6 -5
- data/lib/bcdd/{result/context → context}/expectations/mixin.rb +1 -1
- data/lib/bcdd/{result/context → context}/expectations.rb +2 -2
- data/lib/bcdd/context/failure.rb +9 -0
- data/lib/bcdd/{result/context → context}/mixin.rb +2 -2
- data/lib/bcdd/{result/context → context}/success.rb +11 -11
- data/lib/bcdd/context.rb +115 -0
- data/lib/bcdd/failure.rb +23 -0
- data/lib/bcdd/result/_self.rb +198 -0
- data/lib/bcdd/result/callable_and_then/caller.rb +1 -1
- data/lib/bcdd/result/config/switchers/addons.rb +2 -2
- data/lib/bcdd/result/config/switchers/constant_aliases.rb +1 -3
- data/lib/bcdd/result/config/switchers/features.rb +5 -5
- data/lib/bcdd/result/config/switchers/pattern_matching.rb +1 -1
- data/lib/bcdd/result/config.rb +7 -5
- data/lib/bcdd/result/contract/type_checker.rb +4 -0
- data/lib/bcdd/result/{transitions → event_logs}/config.rb +5 -3
- data/lib/bcdd/result/{transitions → event_logs}/listener.rb +5 -5
- data/lib/bcdd/result/{transitions → event_logs}/listeners.rb +17 -17
- data/lib/bcdd/result/{transitions → event_logs}/tracking/disabled.rb +1 -1
- data/lib/bcdd/result/{transitions → event_logs}/tracking/enabled.rb +15 -13
- data/lib/bcdd/result/{transitions → event_logs}/tracking.rb +4 -3
- data/lib/bcdd/result/{transitions → event_logs}/tree.rb +27 -11
- data/lib/bcdd/result/event_logs.rb +27 -0
- data/lib/bcdd/result/failure.rb +1 -3
- data/lib/bcdd/result/success.rb +1 -3
- data/lib/bcdd/result/version.rb +1 -1
- data/lib/bcdd/result.rb +23 -191
- data/lib/bcdd/success.rb +23 -0
- data/sig/bcdd/context.rbs +175 -0
- data/sig/bcdd/failure.rbs +13 -0
- data/sig/bcdd/result/config.rbs +1 -3
- data/sig/bcdd/result/context.rbs +2 -174
- data/sig/bcdd/result/contract.rbs +1 -0
- data/sig/bcdd/result/{transitions.rbs → event_logs.rbs} +19 -19
- data/sig/bcdd/result.rbs +13 -31
- data/sig/bcdd/success.rbs +13 -0
- metadata +41 -24
- data/examples/multiple_listeners/lib/bcdd/result/transitions_record.rb +0 -28
- data/examples/multiple_listeners/lib/transitions_listener/stdout.rb +0 -54
- data/lib/bcdd/result/context/failure.rb +0 -9
- data/lib/bcdd/result/context.rb +0 -93
- data/lib/bcdd/result/failure/methods.rb +0 -21
- data/lib/bcdd/result/success/methods.rb +0 -21
- data/lib/bcdd/result/transitions.rb +0 -27
data/lib/bcdd/result.rb
CHANGED
@@ -1,197 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'set'
|
4
|
-
require 'singleton'
|
5
4
|
|
6
|
-
|
7
|
-
require_relative '
|
8
|
-
require_relative '
|
9
|
-
|
10
|
-
|
11
|
-
require_relative 'result/
|
12
|
-
require_relative 'result/
|
13
|
-
require_relative 'result/
|
14
|
-
require_relative 'result/
|
15
|
-
require_relative 'result/
|
16
|
-
require_relative 'result/
|
17
|
-
require_relative 'result/
|
18
|
-
require_relative 'result/
|
19
|
-
require_relative 'result/
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
def self.config
|
31
|
-
Config.instance
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.configuration(freeze: true)
|
35
|
-
yield(config)
|
36
|
-
|
37
|
-
freeze and config.freeze
|
38
|
-
end
|
39
|
-
|
40
|
-
def initialize(type:, value:, source: nil, expectations: nil, terminal: nil)
|
41
|
-
data = Data.new(kind, type, value)
|
42
|
-
|
43
|
-
@type_checker = Contract.evaluate(data, expectations)
|
44
|
-
@source = source
|
45
|
-
@terminal = kind == :failure || (terminal && !IgnoredTypes.include?(type))
|
46
|
-
@data = data
|
47
|
-
|
48
|
-
self.unknown = true
|
49
|
-
self.transitions = Transitions::Tracking::EMPTY
|
50
|
-
|
51
|
-
Transitions.tracking.record(self)
|
52
|
-
end
|
53
|
-
|
54
|
-
def terminal?
|
55
|
-
terminal
|
56
|
-
end
|
57
|
-
|
58
|
-
def type
|
59
|
-
data.type
|
60
|
-
end
|
61
|
-
|
62
|
-
def value
|
63
|
-
data.value
|
64
|
-
end
|
65
|
-
|
66
|
-
def success?(_type = nil)
|
67
|
-
raise Error::NotImplemented
|
68
|
-
end
|
69
|
-
|
70
|
-
def failure?(_type = nil)
|
71
|
-
raise Error::NotImplemented
|
72
|
-
end
|
73
|
-
|
74
|
-
def value_or(&_block)
|
75
|
-
raise Error::NotImplemented
|
76
|
-
end
|
77
|
-
|
78
|
-
def on(*types, &block)
|
79
|
-
raise Error::MissingTypeArgument if types.empty?
|
80
|
-
|
81
|
-
tap { known(block) if type_checker.allow?(types) }
|
82
|
-
end
|
83
|
-
|
84
|
-
def on_success(*types, &block)
|
85
|
-
tap { known(block) if type_checker.allow_success?(types) && success? }
|
86
|
-
end
|
87
|
-
|
88
|
-
def on_failure(*types, &block)
|
89
|
-
tap { known(block) if type_checker.allow_failure?(types) && failure? }
|
90
|
-
end
|
91
|
-
|
92
|
-
def on_unknown
|
93
|
-
tap { yield(value, type) if unknown }
|
94
|
-
end
|
95
|
-
|
96
|
-
def and_then(method_name = nil, injected_value = nil, &block)
|
97
|
-
return self if terminal?
|
98
|
-
|
99
|
-
method_name && block and raise ::ArgumentError, 'method_name and block are mutually exclusive'
|
100
|
-
|
101
|
-
method_name ? call_and_then_source_method(method_name, injected_value) : call_and_then_block(block)
|
102
|
-
end
|
103
|
-
|
104
|
-
def and_then!(source, injected_value = nil, _call: nil)
|
105
|
-
raise Error::CallableAndThenDisabled unless Config.instance.feature.enabled?(:and_then!)
|
106
|
-
|
107
|
-
return self if terminal?
|
108
|
-
|
109
|
-
call_and_then_callable!(source, value: value, injected_value: injected_value, method_name: _call)
|
110
|
-
end
|
111
|
-
|
112
|
-
def handle
|
113
|
-
handler = Handler.new(self, type_checker: type_checker)
|
114
|
-
|
115
|
-
yield handler
|
116
|
-
|
117
|
-
handler.send(:outcome)
|
118
|
-
end
|
119
|
-
|
120
|
-
def ==(other)
|
121
|
-
self.class == other.class && type == other.type && value == other.value
|
122
|
-
end
|
123
|
-
|
124
|
-
def hash
|
125
|
-
[self.class, type, value].hash
|
126
|
-
end
|
127
|
-
|
128
|
-
def inspect
|
129
|
-
format('#<%<class_name>s type=%<type>p value=%<value>p>', class_name: self.class.name, type: type, value: value)
|
130
|
-
end
|
131
|
-
|
132
|
-
def deconstruct
|
133
|
-
[type, value]
|
134
|
-
end
|
135
|
-
|
136
|
-
def deconstruct_keys(_keys)
|
137
|
-
{ kind => { type => value } }
|
138
|
-
end
|
139
|
-
|
140
|
-
alias eql? ==
|
141
|
-
alias on_type on
|
142
|
-
|
143
|
-
private
|
144
|
-
|
145
|
-
def kind
|
146
|
-
:unknown
|
147
|
-
end
|
148
|
-
|
149
|
-
def known(block)
|
150
|
-
self.unknown = false
|
151
|
-
|
152
|
-
block.call(value, type)
|
153
|
-
end
|
154
|
-
|
155
|
-
def call_and_then_source_method(method_name, injected_value)
|
156
|
-
method = source.method(method_name)
|
157
|
-
|
158
|
-
Transitions.tracking.record_and_then(method, injected_value) do
|
159
|
-
result = call_and_then_source_method!(method, injected_value)
|
160
|
-
|
161
|
-
ensure_result_object(result, origin: :method)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
def call_and_then_source_method!(method, injected_value)
|
166
|
-
case method.arity
|
167
|
-
when 0 then source.send(method.name)
|
168
|
-
when 1 then source.send(method.name, value)
|
169
|
-
when 2 then source.send(method.name, value, injected_value)
|
170
|
-
else raise Error::InvalidSourceMethodArity.build(source: source, method: method, max_arity: 2)
|
171
|
-
end
|
172
|
-
end
|
173
|
-
|
174
|
-
def call_and_then_block(block)
|
175
|
-
Transitions.tracking.record_and_then(:block, nil) do
|
176
|
-
result = call_and_then_block!(block)
|
177
|
-
|
178
|
-
ensure_result_object(result, origin: :block)
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
def call_and_then_block!(block)
|
183
|
-
block.call(value)
|
184
|
-
end
|
185
|
-
|
186
|
-
def call_and_then_callable!(source, value:, injected_value:, method_name:)
|
187
|
-
CallableAndThen::Caller.call(source, value: value, injected_value: injected_value, method_name: method_name)
|
188
|
-
end
|
189
|
-
|
190
|
-
def ensure_result_object(result, origin:)
|
191
|
-
raise Error::UnexpectedOutcome.build(outcome: result, origin: origin) unless result.is_a?(::BCDD::Result)
|
192
|
-
|
193
|
-
return result if result.source.equal?(source)
|
194
|
-
|
195
|
-
raise Error::InvalidResultSource.build(given_result: result, expected_source: source)
|
5
|
+
module BCDD
|
6
|
+
require_relative 'success'
|
7
|
+
require_relative 'failure'
|
8
|
+
|
9
|
+
class Result
|
10
|
+
require_relative 'result/version'
|
11
|
+
require_relative 'result/error'
|
12
|
+
require_relative 'result/ignored_types'
|
13
|
+
require_relative 'result/event_logs'
|
14
|
+
require_relative 'result/callable_and_then'
|
15
|
+
require_relative 'result/data'
|
16
|
+
require_relative 'result/handler'
|
17
|
+
require_relative 'result/failure'
|
18
|
+
require_relative 'result/success'
|
19
|
+
require_relative 'result/mixin'
|
20
|
+
require_relative 'result/contract'
|
21
|
+
require_relative 'result/expectations'
|
22
|
+
require_relative 'result/config'
|
23
|
+
require_relative 'result/_self'
|
24
|
+
|
25
|
+
require_relative 'context'
|
26
|
+
|
27
|
+
Context = ::BCDD::Context
|
196
28
|
end
|
197
29
|
end
|
data/lib/bcdd/success.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BCDD
|
4
|
+
module Success
|
5
|
+
def success?(type = nil)
|
6
|
+
type.nil? || type_checker.allow_success?([type])
|
7
|
+
end
|
8
|
+
|
9
|
+
def failure?(_type = nil)
|
10
|
+
false
|
11
|
+
end
|
12
|
+
|
13
|
+
def value_or
|
14
|
+
value
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def kind
|
20
|
+
:success
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
class BCDD::Context < BCDD::Result
|
2
|
+
EXPECTED_OUTCOME: String
|
3
|
+
|
4
|
+
SourceMethodArity: ^(Method) -> Integer
|
5
|
+
|
6
|
+
attr_reader memo: Hash[Symbol, untyped]
|
7
|
+
|
8
|
+
def initialize: (
|
9
|
+
type: Symbol,
|
10
|
+
value: untyped,
|
11
|
+
?source: untyped,
|
12
|
+
?expectations: BCDD::Result::Contract::Evaluator,
|
13
|
+
?terminal: bool
|
14
|
+
) -> void
|
15
|
+
|
16
|
+
def and_then: (?Symbol, **untyped) ?{ (Hash[Symbol, untyped]) -> untyped } -> untyped
|
17
|
+
|
18
|
+
def and_then!: (untyped, **untyped) -> untyped
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def call_and_then_source_method: (Symbol, Hash[Symbol, untyped]) -> BCDD::Context
|
23
|
+
|
24
|
+
def call_and_then_callable!: (untyped, value: untyped, injected_value: untyped, method_name: (Symbol | nil)) -> BCDD::Context
|
25
|
+
|
26
|
+
def ensure_result_object: (untyped, origin: Symbol) -> BCDD::Context
|
27
|
+
|
28
|
+
def raise_unexpected_outcome_error: (BCDD::Context | untyped, Symbol) -> void
|
29
|
+
end
|
30
|
+
|
31
|
+
class BCDD::Context
|
32
|
+
class Error < BCDD::Result::Error
|
33
|
+
class InvalidExposure < BCDD::Context::Error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class BCDD::Context
|
39
|
+
class Success < BCDD::Context
|
40
|
+
include BCDD::Success
|
41
|
+
|
42
|
+
FetchValues: Proc
|
43
|
+
|
44
|
+
def and_expose: (Symbol, Array[Symbol], terminal: bool) -> BCDD::Context::Success
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.Success: (Symbol, **untyped) -> BCDD::Context::Success
|
48
|
+
end
|
49
|
+
|
50
|
+
module BCDD::Context::CallableAndThen
|
51
|
+
class Caller < BCDD::Result::CallableAndThen::Caller
|
52
|
+
module KeyArgs
|
53
|
+
def self.parameters?: (untyped) -> bool
|
54
|
+
|
55
|
+
def self.invalid_arity: (untyped, Symbol) -> BCDD::Result::CallableAndThen::Error::InvalidArity
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.call: (
|
59
|
+
untyped source,
|
60
|
+
value: untyped,
|
61
|
+
injected_value: untyped,
|
62
|
+
method_name: (Symbol | nil),
|
63
|
+
) -> BCDD::Context
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def self.call_proc!: (
|
68
|
+
untyped source,
|
69
|
+
Hash[Symbol, untyped] value,
|
70
|
+
nil injected_value
|
71
|
+
) -> BCDD::Context
|
72
|
+
|
73
|
+
def self.call_method!: (
|
74
|
+
untyped source,
|
75
|
+
Method method,
|
76
|
+
Hash[Symbol, untyped] value,
|
77
|
+
nil injected_value
|
78
|
+
) -> BCDD::Context
|
79
|
+
|
80
|
+
def self.callable_method: (
|
81
|
+
untyped source,
|
82
|
+
(Symbol | nil) method_name
|
83
|
+
) -> ::Method
|
84
|
+
|
85
|
+
def self.ensure_result_object: (
|
86
|
+
untyped source,
|
87
|
+
untyped value,
|
88
|
+
BCDD::Context result
|
89
|
+
) -> BCDD::Context
|
90
|
+
|
91
|
+
def self.expected_result_object: () -> singleton(BCDD::Context)
|
92
|
+
|
93
|
+
def self.expected_outcome: () -> String
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
class BCDD::Context
|
98
|
+
class Failure < BCDD::Context
|
99
|
+
include BCDD::Failure
|
100
|
+
|
101
|
+
def and_expose: (Symbol, Array[Symbol], **untyped) -> BCDD::Context::Failure
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.Failure: (Symbol, **untyped) -> BCDD::Context::Failure
|
105
|
+
end
|
106
|
+
|
107
|
+
class BCDD::Context
|
108
|
+
module Mixin
|
109
|
+
Factory: singleton(BCDD::Result::Mixin::Factory)
|
110
|
+
|
111
|
+
module Methods
|
112
|
+
def Success: (Symbol, **untyped) -> BCDD::Context::Success
|
113
|
+
|
114
|
+
def Failure: (Symbol, **untyped) -> BCDD::Context::Failure
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
def _ResultAs: (singleton(BCDD::Context), Symbol, untyped, ?terminal: bool) -> untyped
|
119
|
+
end
|
120
|
+
|
121
|
+
module Addons
|
122
|
+
module Continue
|
123
|
+
include BCDD::Context::Mixin::Methods
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
def Continue: (**untyped) -> BCDD::Context::Success
|
128
|
+
end
|
129
|
+
|
130
|
+
module Given
|
131
|
+
include BCDD::Context::Mixin::Methods
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
def Given: (*untyped) -> BCDD::Context::Success
|
136
|
+
end
|
137
|
+
|
138
|
+
OPTIONS: Hash[Symbol, Module]
|
139
|
+
|
140
|
+
def self.options: (Hash[Symbol, Hash[Symbol, bool]]) -> Hash[Symbol, Module]
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def self.mixin_module: -> singleton(BCDD::Context::Mixin)
|
145
|
+
|
146
|
+
def self.result_factory: -> singleton(BCDD::Context)
|
147
|
+
end
|
148
|
+
|
149
|
+
class BCDD::Context::Expectations < BCDD::Result::Expectations
|
150
|
+
def self.mixin_module: -> singleton(BCDD::Context::Expectations::Mixin)
|
151
|
+
|
152
|
+
def self.result_factory_without_expectations: -> singleton(BCDD::Result)
|
153
|
+
|
154
|
+
def Success: (Symbol, **untyped) -> BCDD::Context::Success
|
155
|
+
def Failure: (Symbol, **untyped) -> BCDD::Context::Failure
|
156
|
+
end
|
157
|
+
|
158
|
+
module BCDD::Context::Expectations::Mixin
|
159
|
+
Methods: singleton(BCDD::Result::Expectations::Mixin::Methods)
|
160
|
+
Factory: singleton(BCDD::Result::Expectations::Mixin::Factory)
|
161
|
+
|
162
|
+
module Addons
|
163
|
+
module Continue
|
164
|
+
private def Continue: (**untyped) -> BCDD::Context::Success
|
165
|
+
end
|
166
|
+
|
167
|
+
module Given
|
168
|
+
private def Given: (*untyped) -> BCDD::Context::Success
|
169
|
+
end
|
170
|
+
|
171
|
+
OPTIONS: Hash[Symbol, Module]
|
172
|
+
|
173
|
+
def self.options: (Hash[Symbol, Hash[Symbol, bool]]) -> Hash[Symbol, Module]
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module BCDD
|
2
|
+
module Failure
|
3
|
+
def success?: (?Symbol type) -> bool
|
4
|
+
def failure?: (?Symbol type) -> bool
|
5
|
+
def value_or: { (untyped) -> untyped } -> untyped
|
6
|
+
def value: -> untyped
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def kind: -> Symbol
|
11
|
+
def type_checker: -> BCDD::Result::Contract::TypeChecker
|
12
|
+
end
|
13
|
+
end
|
data/sig/bcdd/result/config.rbs
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
class BCDD::Result::Config
|
2
|
-
include Singleton
|
3
|
-
|
4
2
|
ADDON: Hash[Symbol, Hash[Symbol, untyped]]
|
5
3
|
FEATURE: Hash[Symbol, Hash[Symbol, untyped]]
|
6
4
|
PATTERN_MATCHING: Hash[Symbol, Hash[Symbol, untyped]]
|
@@ -15,7 +13,7 @@ class BCDD::Result::Config
|
|
15
13
|
def initialize: -> void
|
16
14
|
|
17
15
|
def and_then!: () -> BCDD::Result::CallableAndThen::Config
|
18
|
-
def
|
16
|
+
def event_logs: () -> BCDD::Result::EventLogs::Config
|
19
17
|
|
20
18
|
def freeze: -> BCDD::Result::Config
|
21
19
|
def options: -> Hash[Symbol, BCDD::Result::Config::Switcher]
|
data/sig/bcdd/result/context.rbs
CHANGED
@@ -1,175 +1,3 @@
|
|
1
|
-
class BCDD::Result
|
2
|
-
|
3
|
-
|
4
|
-
SourceMethodArity: ^(Method) -> Integer
|
5
|
-
|
6
|
-
attr_reader acc: Hash[Symbol, untyped]
|
7
|
-
|
8
|
-
def initialize: (
|
9
|
-
type: Symbol,
|
10
|
-
value: untyped,
|
11
|
-
?source: untyped,
|
12
|
-
?expectations: BCDD::Result::Contract::Evaluator,
|
13
|
-
?terminal: bool
|
14
|
-
) -> void
|
15
|
-
|
16
|
-
def and_then: (?Symbol, **untyped) ?{ (Hash[Symbol, untyped]) -> untyped } -> untyped
|
17
|
-
|
18
|
-
def and_then!: (untyped, **untyped) -> untyped
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def call_and_then_source_method: (Symbol, Hash[Symbol, untyped]) -> BCDD::Result::Context
|
23
|
-
|
24
|
-
def call_and_then_callable!: (untyped, value: untyped, injected_value: untyped, method_name: (Symbol | nil)) -> BCDD::Result::Context
|
25
|
-
|
26
|
-
def ensure_result_object: (untyped, origin: Symbol) -> BCDD::Result::Context
|
27
|
-
|
28
|
-
def raise_unexpected_outcome_error: (BCDD::Result::Context | untyped, Symbol) -> void
|
29
|
-
end
|
30
|
-
|
31
|
-
class BCDD::Result::Context
|
32
|
-
class Error < BCDD::Result::Error
|
33
|
-
class InvalidExposure < BCDD::Result::Context::Error
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
class BCDD::Result::Context
|
39
|
-
class Success < BCDD::Result::Context
|
40
|
-
include BCDD::Result::Success::Methods
|
41
|
-
|
42
|
-
FetchValues: Proc
|
43
|
-
|
44
|
-
def and_expose: (Symbol, Array[Symbol], terminal: bool) -> BCDD::Result::Context::Success
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.Success: (Symbol, **untyped) -> BCDD::Result::Context::Success
|
48
|
-
end
|
49
|
-
|
50
|
-
module BCDD::Result::Context::CallableAndThen
|
51
|
-
class Caller < BCDD::Result::CallableAndThen::Caller
|
52
|
-
module KeyArgs
|
53
|
-
def self.parameters?: (untyped) -> bool
|
54
|
-
|
55
|
-
def self.invalid_arity: (untyped, Symbol) -> BCDD::Result::CallableAndThen::Error::InvalidArity
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.call: (
|
59
|
-
untyped source,
|
60
|
-
value: untyped,
|
61
|
-
injected_value: untyped,
|
62
|
-
method_name: (Symbol | nil),
|
63
|
-
) -> BCDD::Result::Context
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def self.call_proc!: (
|
68
|
-
untyped source,
|
69
|
-
Hash[Symbol, untyped] value,
|
70
|
-
nil injected_value
|
71
|
-
) -> BCDD::Result::Context
|
72
|
-
|
73
|
-
def self.call_method!: (
|
74
|
-
untyped source,
|
75
|
-
Method method,
|
76
|
-
Hash[Symbol, untyped] value,
|
77
|
-
nil injected_value
|
78
|
-
) -> BCDD::Result::Context
|
79
|
-
|
80
|
-
def self.callable_method: (
|
81
|
-
untyped source,
|
82
|
-
(Symbol | nil) method_name
|
83
|
-
) -> ::Method
|
84
|
-
|
85
|
-
def self.ensure_result_object: (
|
86
|
-
untyped source,
|
87
|
-
untyped value,
|
88
|
-
BCDD::Result::Context result
|
89
|
-
) -> BCDD::Result::Context
|
90
|
-
|
91
|
-
def self.expected_result_object: () -> singleton(BCDD::Result::Context)
|
92
|
-
|
93
|
-
def self.expected_outcome: () -> String
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
class BCDD::Result::Context
|
98
|
-
class Failure < BCDD::Result::Context
|
99
|
-
include BCDD::Result::Failure::Methods
|
100
|
-
|
101
|
-
def and_expose: (Symbol, Array[Symbol], **untyped) -> BCDD::Result::Context::Failure
|
102
|
-
end
|
103
|
-
|
104
|
-
def self.Failure: (Symbol, **untyped) -> BCDD::Result::Context::Failure
|
105
|
-
end
|
106
|
-
|
107
|
-
class BCDD::Result::Context
|
108
|
-
module Mixin
|
109
|
-
Factory: singleton(BCDD::Result::Mixin::Factory)
|
110
|
-
|
111
|
-
module Methods
|
112
|
-
def Success: (Symbol, **untyped) -> BCDD::Result::Context::Success
|
113
|
-
|
114
|
-
def Failure: (Symbol, **untyped) -> BCDD::Result::Context::Failure
|
115
|
-
|
116
|
-
private
|
117
|
-
|
118
|
-
def _ResultAs: (singleton(BCDD::Result::Context), Symbol, untyped, ?terminal: bool) -> untyped
|
119
|
-
end
|
120
|
-
|
121
|
-
module Addons
|
122
|
-
module Continue
|
123
|
-
include BCDD::Result::Context::Mixin::Methods
|
124
|
-
|
125
|
-
private
|
126
|
-
|
127
|
-
def Continue: (**untyped) -> BCDD::Result::Context::Success
|
128
|
-
end
|
129
|
-
|
130
|
-
module Given
|
131
|
-
include BCDD::Result::Context::Mixin::Methods
|
132
|
-
|
133
|
-
private
|
134
|
-
|
135
|
-
def Given: (*untyped) -> BCDD::Result::Context::Success
|
136
|
-
end
|
137
|
-
|
138
|
-
OPTIONS: Hash[Symbol, Module]
|
139
|
-
|
140
|
-
def self.options: (Hash[Symbol, Hash[Symbol, bool]]) -> Hash[Symbol, Module]
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def self.mixin_module: -> singleton(BCDD::Result::Context::Mixin)
|
145
|
-
|
146
|
-
def self.result_factory: -> singleton(BCDD::Result::Context)
|
147
|
-
end
|
148
|
-
|
149
|
-
class BCDD::Result::Context::Expectations < BCDD::Result::Expectations
|
150
|
-
def self.mixin_module: -> singleton(BCDD::Result::Context::Expectations::Mixin)
|
151
|
-
|
152
|
-
def self.result_factory_without_expectations: -> singleton(BCDD::Result)
|
153
|
-
|
154
|
-
def Success: (Symbol, **untyped) -> BCDD::Result::Context::Success
|
155
|
-
def Failure: (Symbol, **untyped) -> BCDD::Result::Context::Failure
|
156
|
-
end
|
157
|
-
|
158
|
-
module BCDD::Result::Context::Expectations::Mixin
|
159
|
-
Methods: singleton(BCDD::Result::Expectations::Mixin::Methods)
|
160
|
-
Factory: singleton(BCDD::Result::Expectations::Mixin::Factory)
|
161
|
-
|
162
|
-
module Addons
|
163
|
-
module Continue
|
164
|
-
private def Continue: (**untyped) -> BCDD::Result::Context::Success
|
165
|
-
end
|
166
|
-
|
167
|
-
module Given
|
168
|
-
private def Given: (*untyped) -> BCDD::Result::Context::Success
|
169
|
-
end
|
170
|
-
|
171
|
-
OPTIONS: Hash[Symbol, Module]
|
172
|
-
|
173
|
-
def self.options: (Hash[Symbol, Hash[Symbol, bool]]) -> Hash[Symbol, Module]
|
174
|
-
end
|
1
|
+
class BCDD::Result
|
2
|
+
Context: BCDD::Context
|
175
3
|
end
|
@@ -26,6 +26,7 @@ module BCDD::Result::Contract
|
|
26
26
|
expectations: BCDD::Result::Contract::Evaluator
|
27
27
|
) -> void
|
28
28
|
|
29
|
+
def allow!: (Symbol) -> Symbol
|
29
30
|
def allow?: (Array[Symbol]) -> bool
|
30
31
|
def allow_success?: (Array[Symbol]) -> bool
|
31
32
|
def allow_failure?: (Array[Symbol]) -> bool
|