lite-validation 0.0.1
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 +7 -0
- data/.rubocop.yml +94 -0
- data/Gemfile +18 -0
- data/README.md +770 -0
- data/bench/calibrational.rb +89 -0
- data/bench/comparative.rb +197 -0
- data/bench/functional.rb +107 -0
- data/bench/profile.rb +45 -0
- data/lib/lite/validation/adapters/interfaces/dry.rb +29 -0
- data/lib/lite/validation/error.rb +9 -0
- data/lib/lite/validation/result/abstract/disputable.rb +17 -0
- data/lib/lite/validation/result/abstract/failure.rb +19 -0
- data/lib/lite/validation/result/abstract/refutable.rb +21 -0
- data/lib/lite/validation/result/abstract/success.rb +25 -0
- data/lib/lite/validation/result/abstract.rb +16 -0
- data/lib/lite/validation/structured_error/record.rb +36 -0
- data/lib/lite/validation/structured_error.rb +23 -0
- data/lib/lite/validation/validator/adapters/errors/default.rb +24 -0
- data/lib/lite/validation/validator/adapters/interfaces/default.rb +32 -0
- data/lib/lite/validation/validator/adapters/interfaces/dry.rb +17 -0
- data/lib/lite/validation/validator/adapters/predicates/dry/adapter.rb +50 -0
- data/lib/lite/validation/validator/adapters/predicates/dry/builder.rb +46 -0
- data/lib/lite/validation/validator/adapters/predicates/dry/engine.rb +32 -0
- data/lib/lite/validation/validator/adapters/predicates/dry.rb +3 -0
- data/lib/lite/validation/validator/coordinator/builder.rb +92 -0
- data/lib/lite/validation/validator/coordinator/default.rb +32 -0
- data/lib/lite/validation/validator/coordinator/errors/builder.rb +56 -0
- data/lib/lite/validation/validator/coordinator/errors/dry.rb +29 -0
- data/lib/lite/validation/validator/coordinator/errors/flat.rb +46 -0
- data/lib/lite/validation/validator/coordinator/errors/hierarchical.rb +29 -0
- data/lib/lite/validation/validator/coordinator/instance.rb +30 -0
- data/lib/lite/validation/validator/coordinator.rb +12 -0
- data/lib/lite/validation/validator/helpers/path.rb +49 -0
- data/lib/lite/validation/validator/node/abstract/branch.rb +21 -0
- data/lib/lite/validation/validator/node/abstract/instance.rb +43 -0
- data/lib/lite/validation/validator/node/abstract/leaf.rb +35 -0
- data/lib/lite/validation/validator/node/abstract.rb +25 -0
- data/lib/lite/validation/validator/node/child.rb +44 -0
- data/lib/lite/validation/validator/node/implementation/apply_ruling.rb +44 -0
- data/lib/lite/validation/validator/node/implementation/dig.rb +38 -0
- data/lib/lite/validation/validator/node/implementation/helpers/call_foreign.rb +31 -0
- data/lib/lite/validation/validator/node/implementation/helpers/with_result.rb +23 -0
- data/lib/lite/validation/validator/node/implementation/helpers/yield_strategy.rb +83 -0
- data/lib/lite/validation/validator/node/implementation/helpers/yield_validator.rb +49 -0
- data/lib/lite/validation/validator/node/implementation/identity.rb +90 -0
- data/lib/lite/validation/validator/node/implementation/iteration/iterator.rb +102 -0
- data/lib/lite/validation/validator/node/implementation/iteration.rb +46 -0
- data/lib/lite/validation/validator/node/implementation/navigation.rb +43 -0
- data/lib/lite/validation/validator/node/implementation/predication.rb +61 -0
- data/lib/lite/validation/validator/node/implementation/scoping/evaluator.rb +43 -0
- data/lib/lite/validation/validator/node/implementation/scoping.rb +43 -0
- data/lib/lite/validation/validator/node/implementation/validation.rb +64 -0
- data/lib/lite/validation/validator/node/implementation/wrap.rb +26 -0
- data/lib/lite/validation/validator/node/root.rb +60 -0
- data/lib/lite/validation/validator/node/suspended.rb +33 -0
- data/lib/lite/validation/validator/node.rb +12 -0
- data/lib/lite/validation/validator/option/none.rb +43 -0
- data/lib/lite/validation/validator/option/some/abstract.rb +29 -0
- data/lib/lite/validation/validator/option/some/complex/registry/abstract.rb +67 -0
- data/lib/lite/validation/validator/option/some/complex/registry/node.rb +47 -0
- data/lib/lite/validation/validator/option/some/complex/registry/root.rb +31 -0
- data/lib/lite/validation/validator/option/some/complex/registry.rb +32 -0
- data/lib/lite/validation/validator/option/some/complex/wrappers/abstract/iterable.rb +31 -0
- data/lib/lite/validation/validator/option/some/complex/wrappers/abstract/non_iterable.rb +27 -0
- data/lib/lite/validation/validator/option/some/complex/wrappers/abstract.rb +35 -0
- data/lib/lite/validation/validator/option/some/complex/wrappers/array.rb +41 -0
- data/lib/lite/validation/validator/option/some/complex/wrappers/hash.rb +40 -0
- data/lib/lite/validation/validator/option/some/complex/wrappers/object.rb +34 -0
- data/lib/lite/validation/validator/option/some/complex/wrappers/tuple.rb +47 -0
- data/lib/lite/validation/validator/option/some/complex/wrappers.rb +5 -0
- data/lib/lite/validation/validator/option/some/complex.rb +24 -0
- data/lib/lite/validation/validator/option/some/dig.rb +34 -0
- data/lib/lite/validation/validator/option/some/simple.rb +23 -0
- data/lib/lite/validation/validator/option/some/singular.rb +29 -0
- data/lib/lite/validation/validator/option/some.rb +20 -0
- data/lib/lite/validation/validator/option.rb +20 -0
- data/lib/lite/validation/validator/predicate/abstract/variants.rb +23 -0
- data/lib/lite/validation/validator/predicate/foreign/adapter/input/single.rb +21 -0
- data/lib/lite/validation/validator/predicate/foreign/adapter/input/tuple.rb +21 -0
- data/lib/lite/validation/validator/predicate/foreign/adapter/input.rb +28 -0
- data/lib/lite/validation/validator/predicate/foreign/adapter/ruling/instance.rb +37 -0
- data/lib/lite/validation/validator/predicate/foreign/adapter/ruling.rb +26 -0
- data/lib/lite/validation/validator/predicate/foreign/engine.rb +27 -0
- data/lib/lite/validation/validator/predicate/foreign/variant.rb +33 -0
- data/lib/lite/validation/validator/predicate/foreign/variants.rb +46 -0
- data/lib/lite/validation/validator/predicate/native/builder.rb +72 -0
- data/lib/lite/validation/validator/predicate/native/definite.rb +19 -0
- data/lib/lite/validation/validator/predicate/native/instance.rb +41 -0
- data/lib/lite/validation/validator/predicate/native/optional.rb +34 -0
- data/lib/lite/validation/validator/predicate/registry.rb +47 -0
- data/lib/lite/validation/validator/predicate.rb +17 -0
- data/lib/lite/validation/validator/result/abstract/failure.rb +21 -0
- data/lib/lite/validation/validator/result/abstract/instance.rb +18 -0
- data/lib/lite/validation/validator/result/abstract/success.rb +17 -0
- data/lib/lite/validation/validator/result/abstract.rb +29 -0
- data/lib/lite/validation/validator/result/committed.rb +75 -0
- data/lib/lite/validation/validator/result/disputable/hash.rb +17 -0
- data/lib/lite/validation/validator/result/disputable/instance.rb +43 -0
- data/lib/lite/validation/validator/result/disputable/iterable/array.rb +23 -0
- data/lib/lite/validation/validator/result/disputable/iterable.rb +17 -0
- data/lib/lite/validation/validator/result/disputable/navigable.rb +35 -0
- data/lib/lite/validation/validator/result/disputable.rb +14 -0
- data/lib/lite/validation/validator/result/disputed/abstract/hash.rb +32 -0
- data/lib/lite/validation/validator/result/disputed/abstract/instance.rb +26 -0
- data/lib/lite/validation/validator/result/disputed/iterable/array.rb +42 -0
- data/lib/lite/validation/validator/result/disputed/iterable/hash.rb +38 -0
- data/lib/lite/validation/validator/result/disputed/iterable.rb +20 -0
- data/lib/lite/validation/validator/result/disputed/navigable.rb +59 -0
- data/lib/lite/validation/validator/result/disputed.rb +17 -0
- data/lib/lite/validation/validator/result/refuted.rb +78 -0
- data/lib/lite/validation/validator/result/valid/abstract/collect.rb +42 -0
- data/lib/lite/validation/validator/result/valid/abstract/commit.rb +25 -0
- data/lib/lite/validation/validator/result/valid/abstract/instance.rb +23 -0
- data/lib/lite/validation/validator/result/valid/iterable/array/abstract.rb +24 -0
- data/lib/lite/validation/validator/result/valid/iterable/array/tuples.rb +64 -0
- data/lib/lite/validation/validator/result/valid/iterable/array/values.rb +42 -0
- data/lib/lite/validation/validator/result/valid/iterable/hash.rb +46 -0
- data/lib/lite/validation/validator/result/valid/iterable.rb +33 -0
- data/lib/lite/validation/validator/result/valid/navigable.rb +68 -0
- data/lib/lite/validation/validator/result/valid.rb +21 -0
- data/lib/lite/validation/validator/result.rb +15 -0
- data/lib/lite/validation/validator/ruling/abstract/invalid.rb +59 -0
- data/lib/lite/validation/validator/ruling/abstract/valid.rb +23 -0
- data/lib/lite/validation/validator/ruling/abstract.rb +12 -0
- data/lib/lite/validation/validator/ruling/commit.rb +17 -0
- data/lib/lite/validation/validator/ruling/dispute.rb +21 -0
- data/lib/lite/validation/validator/ruling/invalidate.rb +32 -0
- data/lib/lite/validation/validator/ruling/pass.rb +19 -0
- data/lib/lite/validation/validator/ruling/refute.rb +21 -0
- data/lib/lite/validation/validator/ruling.rb +53 -0
- data/lib/lite/validation/validator/state/instance.rb +46 -0
- data/lib/lite/validation/validator/state/merge_strategy.rb +50 -0
- data/lib/lite/validation/validator/state/unwrap_strategy.rb +31 -0
- data/lib/lite/validation/validator/state.rb +21 -0
- data/lib/lite/validation/validator.rb +15 -0
- data/lib/lite/validation/version.rb +9 -0
- data/lib/lite/validation.rb +8 -0
- metadata +196 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'abstract/instance'
|
|
4
|
+
require_relative 'abstract/failure'
|
|
5
|
+
|
|
6
|
+
module Lite
|
|
7
|
+
module Validation
|
|
8
|
+
module Validator
|
|
9
|
+
module Result
|
|
10
|
+
class Refuted < Abstract::Instance
|
|
11
|
+
include Abstract::Failure
|
|
12
|
+
|
|
13
|
+
Lite::Data.define(self, args: %i[error], kwargs: [:fall_through])
|
|
14
|
+
|
|
15
|
+
def self.instance(error, *args, fall_through: false)
|
|
16
|
+
raise Error::Fatal, "Structured error expected, got: #{error.inspect}" unless error.is_a?(StructuredError)
|
|
17
|
+
|
|
18
|
+
new(error, *args, fall_through: fall_through)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private_class_method :new
|
|
22
|
+
|
|
23
|
+
def success_at?(*_path)
|
|
24
|
+
false
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def committed?
|
|
28
|
+
false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def refuted?
|
|
32
|
+
true
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def commit(_value)
|
|
36
|
+
self
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def auto_commit(as:)
|
|
40
|
+
self
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def dispute(error)
|
|
44
|
+
raise Error, "Structured error expected, got: #{error.inspect}" unless error.is_a?(StructuredError)
|
|
45
|
+
|
|
46
|
+
self
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def refute(error)
|
|
50
|
+
raise Error::Fatal, "Structured error expected, got: #{error.inspect}" unless error.is_a?(StructuredError)
|
|
51
|
+
|
|
52
|
+
self
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def navigable
|
|
56
|
+
self
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def navigate(*_path, &_block)
|
|
60
|
+
self
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def errors_root
|
|
64
|
+
[error]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def children
|
|
68
|
+
EMPTY
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def inspect
|
|
72
|
+
signature('Refuted', "error=#{error.code}")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'commit'
|
|
4
|
+
require_relative '../../../../error'
|
|
5
|
+
|
|
6
|
+
module Lite
|
|
7
|
+
module Validation
|
|
8
|
+
module Validator
|
|
9
|
+
module Result
|
|
10
|
+
module Valid
|
|
11
|
+
module Abstract
|
|
12
|
+
module Collect
|
|
13
|
+
include Commit
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def collect_committed(as:)
|
|
18
|
+
case as
|
|
19
|
+
when :array then collect_committed_as_array
|
|
20
|
+
when :hash then collect_committed_as_hash
|
|
21
|
+
else raise Error::Fatal, "Unexpected option: #{as}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def collect_committed_as_hash
|
|
26
|
+
each_child({}) do |(key, child), acc|
|
|
27
|
+
next unless child.committed?
|
|
28
|
+
|
|
29
|
+
acc[key] = child.send :value
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def each_child(initial_object, &block)
|
|
34
|
+
children.each_with_object(initial_object, &block)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../committed'
|
|
4
|
+
|
|
5
|
+
module Lite
|
|
6
|
+
module Validation
|
|
7
|
+
module Validator
|
|
8
|
+
module Result
|
|
9
|
+
module Valid
|
|
10
|
+
module Abstract
|
|
11
|
+
module Commit
|
|
12
|
+
def commit(value)
|
|
13
|
+
Committed.instance(value)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def unexpected_option!(option)
|
|
17
|
+
raise Error, "Unexpected option: #{option}"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../abstract/success'
|
|
4
|
+
require_relative '../../disputable/instance'
|
|
5
|
+
require_relative '../../committed'
|
|
6
|
+
require_relative '../../disputed'
|
|
7
|
+
require_relative '../../../option'
|
|
8
|
+
|
|
9
|
+
module Lite
|
|
10
|
+
module Validation
|
|
11
|
+
module Validator
|
|
12
|
+
module Result
|
|
13
|
+
module Valid
|
|
14
|
+
module Abstract
|
|
15
|
+
class Instance < Disputable::Instance
|
|
16
|
+
include Result::Abstract::Success
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../../abstract/instance'
|
|
4
|
+
require_relative '../../../disputable/iterable/array'
|
|
5
|
+
require_relative '../../abstract/commit'
|
|
6
|
+
|
|
7
|
+
module Lite
|
|
8
|
+
module Validation
|
|
9
|
+
module Validator
|
|
10
|
+
module Result
|
|
11
|
+
module Valid
|
|
12
|
+
module Iterable
|
|
13
|
+
module Array
|
|
14
|
+
module Abstract
|
|
15
|
+
include Disputable::Iterable::Array
|
|
16
|
+
include Valid::Abstract::Commit
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'abstract'
|
|
4
|
+
|
|
5
|
+
module Lite
|
|
6
|
+
module Validation
|
|
7
|
+
module Validator
|
|
8
|
+
module Result
|
|
9
|
+
module Valid
|
|
10
|
+
module Iterable
|
|
11
|
+
module Array
|
|
12
|
+
class Tuples < Valid::Abstract::Instance
|
|
13
|
+
include Abstract
|
|
14
|
+
|
|
15
|
+
Lite::Data.define(self, args: %i[commit_as])
|
|
16
|
+
|
|
17
|
+
def self.instance(commit, *args)
|
|
18
|
+
new(commit, [], *args)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def inspect
|
|
22
|
+
signature('Valid::Iterable::Array::Tuples', nil)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def navigable
|
|
26
|
+
case commit_as
|
|
27
|
+
when false then Valid.navigable(children.to_h.freeze)
|
|
28
|
+
when :hash then commit(children.to_h.freeze)
|
|
29
|
+
else unexpected_option!(commit_as)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def child(_key)
|
|
34
|
+
Result.valid
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def merge(result, key)
|
|
38
|
+
if result.failure?
|
|
39
|
+
Disputed::Iterable.initial.append(result, key)
|
|
40
|
+
else
|
|
41
|
+
merge_success(result, key)
|
|
42
|
+
self
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def merge_success(result, key)
|
|
49
|
+
case commit_as
|
|
50
|
+
when false
|
|
51
|
+
children << [key, result]
|
|
52
|
+
when :hash
|
|
53
|
+
children << [key, result.value] if result.committed?
|
|
54
|
+
else unexpected_option!(commit_as)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'abstract'
|
|
4
|
+
|
|
5
|
+
module Lite
|
|
6
|
+
module Validation
|
|
7
|
+
module Validator
|
|
8
|
+
module Result
|
|
9
|
+
module Valid
|
|
10
|
+
module Iterable
|
|
11
|
+
module Array
|
|
12
|
+
class Values < Valid::Abstract::Instance
|
|
13
|
+
include Abstract
|
|
14
|
+
|
|
15
|
+
def self.instance(*args)
|
|
16
|
+
new([], *args)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def inspect
|
|
20
|
+
signature('Valid::Iterable::Array::Values', nil)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def navigable
|
|
24
|
+
commit(children.freeze)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def merge(result, key)
|
|
28
|
+
if result.success?
|
|
29
|
+
children << result.value if result.committed?
|
|
30
|
+
self
|
|
31
|
+
else
|
|
32
|
+
Disputed::Iterable.initial.append(result, key)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../abstract/instance'
|
|
4
|
+
require_relative '../../disputable/hash'
|
|
5
|
+
require_relative '../../disputable/iterable'
|
|
6
|
+
|
|
7
|
+
module Lite
|
|
8
|
+
module Validation
|
|
9
|
+
module Validator
|
|
10
|
+
module Result
|
|
11
|
+
module Valid
|
|
12
|
+
module Iterable
|
|
13
|
+
class Hash < Valid::Abstract::Instance
|
|
14
|
+
include Disputable::Hash
|
|
15
|
+
include Disputable::Iterable
|
|
16
|
+
|
|
17
|
+
Lite::Data.define(self, args: %i[commit_as])
|
|
18
|
+
|
|
19
|
+
def self.instance(commit, children)
|
|
20
|
+
new(commit, children.dup)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def inspect
|
|
24
|
+
signature('Valid::Iterable::Hash', nil)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def navigable
|
|
28
|
+
navigable = Valid.navigable(children)
|
|
29
|
+
commit_as ? navigable.auto_commit(as: commit_as) : navigable
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def merge(result, key)
|
|
33
|
+
if result.success?
|
|
34
|
+
children.merge!(key => result) if commit_as == false || result.committed?
|
|
35
|
+
self
|
|
36
|
+
else
|
|
37
|
+
Disputed::Iterable.initial.append(result, key)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'iterable/array/tuples'
|
|
4
|
+
require_relative 'iterable/array/values'
|
|
5
|
+
require_relative 'iterable/hash'
|
|
6
|
+
|
|
7
|
+
module Lite
|
|
8
|
+
module Validation
|
|
9
|
+
module Validator
|
|
10
|
+
module Result
|
|
11
|
+
module Valid
|
|
12
|
+
module Iterable
|
|
13
|
+
def self.instance(children, commit:)
|
|
14
|
+
if children.empty?
|
|
15
|
+
initial(commit: commit)
|
|
16
|
+
else
|
|
17
|
+
Hash.instance(commit, children)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.initial(commit:)
|
|
22
|
+
case commit
|
|
23
|
+
when :hash, false then Array::Tuples.instance(commit)
|
|
24
|
+
when :array then Array::Values.instance
|
|
25
|
+
else raise Error, "Unexpected option: #{commit}"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'iterable'
|
|
4
|
+
require_relative '../disputable/navigable'
|
|
5
|
+
require_relative 'abstract/collect'
|
|
6
|
+
|
|
7
|
+
module Lite
|
|
8
|
+
module Validation
|
|
9
|
+
module Validator
|
|
10
|
+
module Result
|
|
11
|
+
module Valid
|
|
12
|
+
class Navigable < Abstract::Instance
|
|
13
|
+
include Disputable::Navigable
|
|
14
|
+
include Abstract::Collect
|
|
15
|
+
|
|
16
|
+
def self.instance(*args)
|
|
17
|
+
new(EMPTY, *args)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize(children, *args)
|
|
21
|
+
super(children.freeze, *args)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def auto_commit(as:)
|
|
25
|
+
commit(collect_committed(as: as))
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def dispute(error)
|
|
29
|
+
Disputed::Navigable.instance(error: error)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def success
|
|
33
|
+
Option.none
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def inspect
|
|
37
|
+
signature('Valid::Navigable', nil)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def iterable(commit:)
|
|
41
|
+
Iterable.instance(children, commit: commit)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def merge(result, key)
|
|
45
|
+
if result.success?
|
|
46
|
+
self.class.send(
|
|
47
|
+
:new,
|
|
48
|
+
children.merge(key => result)
|
|
49
|
+
)
|
|
50
|
+
else
|
|
51
|
+
Disputed::Navigable.instance.append(result, key)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def collect_committed_as_array
|
|
58
|
+
children.values
|
|
59
|
+
.lazy
|
|
60
|
+
.select(&:committed?)
|
|
61
|
+
.map(&:value).force
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'abstract/success'
|
|
4
|
+
require_relative 'valid/navigable'
|
|
5
|
+
require_relative 'committed'
|
|
6
|
+
require_relative 'disputed'
|
|
7
|
+
require_relative '../option'
|
|
8
|
+
|
|
9
|
+
module Lite
|
|
10
|
+
module Validation
|
|
11
|
+
module Validator
|
|
12
|
+
module Result
|
|
13
|
+
module Valid
|
|
14
|
+
def self.navigable(children)
|
|
15
|
+
Valid::Navigable.send(:new, children)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'lite/data'
|
|
4
|
+
|
|
5
|
+
require_relative '../abstract'
|
|
6
|
+
require_relative '../../../error'
|
|
7
|
+
require_relative '../../../structured_error'
|
|
8
|
+
|
|
9
|
+
module Lite
|
|
10
|
+
module Validation
|
|
11
|
+
module Validator
|
|
12
|
+
module Ruling
|
|
13
|
+
module Abstract
|
|
14
|
+
class Invalid
|
|
15
|
+
module Abstract
|
|
16
|
+
include Ruling::Abstract
|
|
17
|
+
|
|
18
|
+
def invalid(&block)
|
|
19
|
+
block.call(self)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class Raw
|
|
24
|
+
include Abstract
|
|
25
|
+
|
|
26
|
+
Lite::Data.define(self, args: %i[code message data])
|
|
27
|
+
|
|
28
|
+
def self.instance(code, message: nil, data: nil)
|
|
29
|
+
new code, message, data
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def structured_error(coordinator)
|
|
33
|
+
coordinator.structured_error(code, message: message, data: data)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
include Abstract
|
|
38
|
+
|
|
39
|
+
Lite::Data.define(self, args: [:error])
|
|
40
|
+
|
|
41
|
+
def self.instance(error, **opts)
|
|
42
|
+
case [error, opts]
|
|
43
|
+
in [StructuredError, {}] then new error
|
|
44
|
+
in [Symbol, { ** }] then self::Raw.instance(error, **opts)
|
|
45
|
+
else raise Error::Fatal, "Unexpected first argument: #{error.inspect}"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private_class_method :new
|
|
50
|
+
|
|
51
|
+
def structured_error(*)
|
|
52
|
+
error
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'lite/data'
|
|
4
|
+
|
|
5
|
+
require_relative '../abstract'
|
|
6
|
+
require_relative '../../../error'
|
|
7
|
+
require_relative '../../../structured_error'
|
|
8
|
+
|
|
9
|
+
module Lite
|
|
10
|
+
module Validation
|
|
11
|
+
module Validator
|
|
12
|
+
module Ruling
|
|
13
|
+
module Abstract
|
|
14
|
+
module Valid
|
|
15
|
+
def invalid(&_block)
|
|
16
|
+
self
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'lite/data'
|
|
4
|
+
require_relative 'abstract/valid'
|
|
5
|
+
|
|
6
|
+
module Lite
|
|
7
|
+
module Validation
|
|
8
|
+
module Validator
|
|
9
|
+
module Ruling
|
|
10
|
+
class Commit
|
|
11
|
+
Lite::Data.define(self, args: [:value])
|
|
12
|
+
include Abstract::Valid
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'abstract/invalid'
|
|
4
|
+
|
|
5
|
+
module Lite
|
|
6
|
+
module Validation
|
|
7
|
+
module Validator
|
|
8
|
+
module Ruling
|
|
9
|
+
class Dispute < Ruling::Abstract::Invalid
|
|
10
|
+
module Abstract; end
|
|
11
|
+
|
|
12
|
+
class Raw < Ruling::Abstract::Invalid::Raw
|
|
13
|
+
include Abstract
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
include Abstract
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'lite/data'
|
|
4
|
+
require_relative 'abstract/invalid'
|
|
5
|
+
|
|
6
|
+
module Lite
|
|
7
|
+
module Validation
|
|
8
|
+
module Validator
|
|
9
|
+
module Ruling
|
|
10
|
+
class Invalidate < Abstract::Invalid
|
|
11
|
+
class Raw < Abstract::Invalid::Raw
|
|
12
|
+
def dispute
|
|
13
|
+
Ruling::Dispute(code, message: message, data: data)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def refute
|
|
17
|
+
Ruling::Refute(code, message: message, data: data)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def dispute
|
|
22
|
+
Ruling::Dispute(error)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def refute
|
|
26
|
+
Ruling::Refute(error)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'abstract/valid'
|
|
4
|
+
|
|
5
|
+
module Lite
|
|
6
|
+
module Validation
|
|
7
|
+
module Validator
|
|
8
|
+
module Ruling
|
|
9
|
+
class Pass
|
|
10
|
+
extend Abstract::Valid
|
|
11
|
+
|
|
12
|
+
def self.===(other)
|
|
13
|
+
equal?(other)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|