sorbet-result 1.0.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/.ruby-version +1 -1
- data/.standard.yml +6 -0
- data/.tool-versions +1 -1
- data/CHANGELOG.md +10 -0
- data/Gemfile +2 -4
- data/Gemfile.lock +75 -55
- data/README.md +23 -0
- data/Rakefile +3 -5
- data/lib/minitest/result_assertions.rb +48 -0
- data/lib/sorbet-result.rb +1 -5
- data/lib/typed/result.rb +169 -7
- data/sorbet/rbi/gems/.gitattributes +1 -0
- data/sorbet/rbi/gems/erubi@1.12.0.rbi +145 -0
- data/sorbet/rbi/gems/{json@2.6.3.rbi → json@2.7.1.rbi} +80 -60
- data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14237 -0
- data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +239 -0
- data/sorbet/rbi/gems/{minitest@5.18.1.rbi → minitest@5.22.2.rbi} +285 -241
- data/sorbet/rbi/gems/{parallel@1.23.0.rbi → parallel@1.24.0.rbi} +8 -1
- data/sorbet/rbi/gems/{parser@3.2.2.3.rbi → parser@3.3.0.5.rbi} +438 -2219
- data/sorbet/rbi/gems/prettier_print@1.2.1.rbi +951 -0
- data/sorbet/rbi/gems/prism@0.24.0.rbi +31040 -0
- data/sorbet/rbi/gems/psych@5.1.2.rbi +1731 -0
- data/sorbet/rbi/gems/{racc@1.7.1.rbi → racc@1.7.3.rbi} +35 -39
- data/sorbet/rbi/gems/{rake@13.0.6.rbi → rake@13.1.0.rbi} +68 -65
- data/sorbet/rbi/gems/{rbi@0.0.16.rbi → rbi@0.1.9.rbi} +712 -714
- data/sorbet/rbi/gems/{regexp_parser@2.8.1.rbi → regexp_parser@2.9.0.rbi} +187 -165
- data/sorbet/rbi/gems/{rexml@3.2.5.rbi → rexml@3.2.6.rbi} +116 -52
- data/sorbet/rbi/gems/{rubocop-ast@1.29.0.rbi → rubocop-ast@1.30.0.rbi} +77 -77
- data/sorbet/rbi/gems/rubocop-performance@1.20.2.rbi +8 -0
- data/sorbet/rbi/gems/rubocop-sorbet@0.7.7.rbi +8 -0
- data/sorbet/rbi/gems/{rubocop@1.52.1.rbi → rubocop@1.60.2.rbi} +3593 -1700
- data/sorbet/rbi/gems/{spoom@1.2.1.rbi → spoom@1.2.4.rbi} +1378 -104
- data/sorbet/rbi/gems/standard-custom@1.0.2.rbi +8 -0
- data/sorbet/rbi/gems/standard-performance@1.3.1.rbi +8 -0
- data/sorbet/rbi/gems/standard-sorbet@0.0.2.rbi +52 -0
- data/sorbet/rbi/gems/standard@1.34.0.rbi +850 -0
- data/sorbet/rbi/gems/stringio@3.1.0.rbi +8 -0
- data/sorbet/rbi/gems/syntax_tree@6.2.0.rbi +23133 -0
- data/sorbet/rbi/gems/{tapioca@0.11.6.rbi → tapioca@0.12.0.rbi} +776 -574
- data/sorbet/rbi/gems/{thor@1.2.2.rbi → thor@1.3.0.rbi} +775 -395
- data/sorbet/rbi/gems/yard-sorbet@0.8.1.rbi +1 -1
- data/sorbet/rbi/gems/yard@0.9.34.rbi +2 -2
- data/sorbet/tapioca/config.yml +3 -12
- data/sorbet/tapioca/require.rb +0 -1
- metadata +41 -34
- data/.rubocop.yml +0 -33
- data/lib/typed/failure.rb +0 -81
- data/lib/typed/success.rb +0 -80
- data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +0 -1083
- data/sorbet/rbi/gems/irb@1.7.0.rbi +0 -342
- data/sorbet/rbi/gems/rubocop-minitest@0.31.0.rbi +0 -2528
- data/sorbet/rbi/gems/rubocop-rake@0.6.0.rbi +0 -328
- data/sorbet/rbi/gems/rubocop-sorbet@0.7.0.rbi +0 -1043
- data/sorbet/rbi/gems/unparser@0.6.8.rbi +0 -4525
- data/sorbet/rbi/gems/zeitwerk@2.6.8.rbi +0 -986
- /data/sorbet/rbi/gems/{io-console@0.6.0.rbi → io-console@0.7.2.rbi} +0 -0
- /data/sorbet/rbi/gems/{reline@0.3.5.rbi → reline@0.4.2.rbi} +0 -0
- /data/sorbet/rbi/gems/{unicode-display_width@2.4.2.rbi → unicode-display_width@2.5.0.rbi} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94d11199cfc745364d1c1163b60f8a1602699f136f5c6522dfa7a81f64d6f8b1
|
4
|
+
data.tar.gz: b867a4439f5a0e5f8335848c42599563149b950a42e54495cbbe1c38b8d4c60d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73a6915ad1ca43e1bc729f4be2d0b7bec3c5dcacce072e96074b0d8ce98b9033ffcbdc254b743e10e5156bac08d418d912f45ea50f83c571774c3419f449f6e9
|
7
|
+
data.tar.gz: 18d8c8f3921cb4d60fde19d8270281f67de8d39aecb57830b8eb6c79e96fdfe5ac18b3ca056e7c265ede393ba91e180d078b9b0aa9396ff4a92f917b26d8819f
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.3.0
|
data/.standard.yml
ADDED
data/.tool-versions
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby 3.
|
1
|
+
ruby 3.3.0
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [1.1.0] - 2024-02-21
|
10
|
+
|
11
|
+
### Added
|
12
|
+
|
13
|
+
- Add minitest assertions for Results
|
14
|
+
|
15
|
+
### Changed
|
16
|
+
|
17
|
+
- Switched to Standard over using Rubocop directly
|
18
|
+
|
9
19
|
## [1.0.0] - 2023-06-20
|
10
20
|
|
11
21
|
### Removed
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,107 +1,127 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
sorbet-result (1.
|
4
|
+
sorbet-result (1.1.0)
|
5
5
|
sorbet-runtime (~> 0.5)
|
6
|
-
zeitwerk (~> 2.6)
|
7
6
|
|
8
7
|
GEM
|
9
8
|
remote: https://rubygems.org/
|
10
9
|
specs:
|
11
10
|
ast (2.4.2)
|
12
|
-
debug (1.
|
13
|
-
irb (
|
14
|
-
reline (>= 0.3.
|
15
|
-
|
16
|
-
io-console (0.
|
17
|
-
irb (1.
|
18
|
-
|
19
|
-
|
20
|
-
|
11
|
+
debug (1.9.1)
|
12
|
+
irb (~> 1.10)
|
13
|
+
reline (>= 0.3.8)
|
14
|
+
erubi (1.12.0)
|
15
|
+
io-console (0.7.2)
|
16
|
+
irb (1.11.2)
|
17
|
+
rdoc
|
18
|
+
reline (>= 0.4.2)
|
19
|
+
json (2.7.1)
|
20
|
+
language_server-protocol (3.17.0.3)
|
21
|
+
lint_roller (1.1.0)
|
22
|
+
minitest (5.22.2)
|
21
23
|
netrc (0.11.0)
|
22
|
-
parallel (1.
|
23
|
-
parser (3.
|
24
|
+
parallel (1.24.0)
|
25
|
+
parser (3.3.0.5)
|
24
26
|
ast (~> 2.4.1)
|
25
27
|
racc
|
26
|
-
|
28
|
+
prettier_print (1.2.1)
|
29
|
+
prism (0.24.0)
|
30
|
+
psych (5.1.2)
|
31
|
+
stringio
|
32
|
+
racc (1.7.3)
|
27
33
|
rainbow (3.1.1)
|
28
|
-
rake (13.0
|
29
|
-
rbi (0.
|
30
|
-
|
31
|
-
parser (>= 2.6.4.0)
|
34
|
+
rake (13.1.0)
|
35
|
+
rbi (0.1.9)
|
36
|
+
prism (>= 0.18.0, < 0.25)
|
32
37
|
sorbet-runtime (>= 0.5.9204)
|
33
|
-
|
34
|
-
|
35
|
-
|
38
|
+
rdoc (6.6.2)
|
39
|
+
psych (>= 4.0.0)
|
40
|
+
regexp_parser (2.9.0)
|
41
|
+
reline (0.4.2)
|
36
42
|
io-console (~> 0.5)
|
37
|
-
rexml (3.2.
|
38
|
-
rubocop (1.
|
43
|
+
rexml (3.2.6)
|
44
|
+
rubocop (1.60.2)
|
39
45
|
json (~> 2.3)
|
46
|
+
language_server-protocol (>= 3.17.0)
|
40
47
|
parallel (~> 1.10)
|
41
|
-
parser (>= 3.
|
48
|
+
parser (>= 3.3.0.2)
|
42
49
|
rainbow (>= 2.2.2, < 4.0)
|
43
50
|
regexp_parser (>= 1.8, < 3.0)
|
44
51
|
rexml (>= 3.2.5, < 4.0)
|
45
|
-
rubocop-ast (>= 1.
|
52
|
+
rubocop-ast (>= 1.30.0, < 2.0)
|
46
53
|
ruby-progressbar (~> 1.7)
|
47
54
|
unicode-display_width (>= 2.4.0, < 3.0)
|
48
|
-
rubocop-ast (1.
|
55
|
+
rubocop-ast (1.30.0)
|
49
56
|
parser (>= 3.2.1.0)
|
50
|
-
rubocop-
|
51
|
-
rubocop (>= 1.
|
52
|
-
|
53
|
-
|
54
|
-
rubocop-sorbet (0.7.0)
|
57
|
+
rubocop-performance (1.20.2)
|
58
|
+
rubocop (>= 1.48.1, < 2.0)
|
59
|
+
rubocop-ast (>= 1.30.0, < 2.0)
|
60
|
+
rubocop-sorbet (0.7.7)
|
55
61
|
rubocop (>= 0.90.0)
|
56
62
|
ruby-progressbar (1.13.0)
|
57
|
-
sorbet (0.5.
|
58
|
-
sorbet-static (= 0.5.
|
59
|
-
sorbet-runtime (0.5.
|
60
|
-
sorbet-static (0.5.
|
61
|
-
sorbet-static (0.5.
|
62
|
-
sorbet-static-and-runtime (0.5.
|
63
|
-
sorbet (= 0.5.
|
64
|
-
sorbet-runtime (= 0.5.
|
65
|
-
spoom (1.2.
|
66
|
-
|
67
|
-
sorbet-runtime (>= 0.5.
|
63
|
+
sorbet (0.5.11262)
|
64
|
+
sorbet-static (= 0.5.11262)
|
65
|
+
sorbet-runtime (0.5.11262)
|
66
|
+
sorbet-static (0.5.11262-universal-darwin)
|
67
|
+
sorbet-static (0.5.11262-x86_64-linux)
|
68
|
+
sorbet-static-and-runtime (0.5.11262)
|
69
|
+
sorbet (= 0.5.11262)
|
70
|
+
sorbet-runtime (= 0.5.11262)
|
71
|
+
spoom (1.2.4)
|
72
|
+
erubi (>= 1.10.0)
|
73
|
+
sorbet-static-and-runtime (>= 0.5.10187)
|
74
|
+
syntax_tree (>= 6.1.1)
|
68
75
|
thor (>= 0.19.2)
|
69
|
-
|
76
|
+
standard (1.34.0)
|
77
|
+
language_server-protocol (~> 3.17.0.2)
|
78
|
+
lint_roller (~> 1.0)
|
79
|
+
rubocop (~> 1.60)
|
80
|
+
standard-custom (~> 1.0.0)
|
81
|
+
standard-performance (~> 1.3)
|
82
|
+
standard-custom (1.0.2)
|
83
|
+
lint_roller (~> 1.0)
|
84
|
+
rubocop (~> 1.50)
|
85
|
+
standard-performance (1.3.1)
|
86
|
+
lint_roller (~> 1.1)
|
87
|
+
rubocop-performance (~> 1.20.2)
|
88
|
+
standard-sorbet (0.0.2)
|
89
|
+
lint_roller (~> 1.1)
|
90
|
+
rubocop-sorbet (~> 0.7.0)
|
91
|
+
stringio (3.1.0)
|
92
|
+
syntax_tree (6.2.0)
|
93
|
+
prettier_print (>= 1.2.0)
|
94
|
+
tapioca (0.12.0)
|
70
95
|
bundler (>= 2.2.25)
|
71
96
|
netrc (>= 0.11.0)
|
72
97
|
parallel (>= 1.21.0)
|
73
|
-
rbi (
|
74
|
-
sorbet-static-and-runtime (>= 0.5.
|
98
|
+
rbi (>= 0.1.4, < 0.2)
|
99
|
+
sorbet-static-and-runtime (>= 0.5.10820)
|
75
100
|
spoom (~> 1.2.0, >= 1.2.0)
|
76
101
|
thor (>= 1.2.0)
|
77
102
|
yard-sorbet
|
78
|
-
thor (1.
|
79
|
-
unicode-display_width (2.
|
80
|
-
unparser (0.6.8)
|
81
|
-
diff-lcs (~> 1.3)
|
82
|
-
parser (>= 3.2.0)
|
103
|
+
thor (1.3.0)
|
104
|
+
unicode-display_width (2.5.0)
|
83
105
|
yard (0.9.34)
|
84
106
|
yard-sorbet (0.8.1)
|
85
107
|
sorbet-runtime (>= 0.5)
|
86
108
|
yard (>= 0.9)
|
87
|
-
zeitwerk (2.6.8)
|
88
109
|
|
89
110
|
PLATFORMS
|
90
111
|
arm64-darwin-22
|
112
|
+
arm64-darwin-23
|
91
113
|
x86_64-linux
|
92
114
|
|
93
115
|
DEPENDENCIES
|
94
116
|
debug
|
95
117
|
minitest
|
96
118
|
rake
|
97
|
-
rubocop
|
98
|
-
rubocop-minitest
|
99
|
-
rubocop-rake
|
100
|
-
rubocop-sorbet
|
101
119
|
sorbet
|
102
120
|
sorbet-result!
|
103
121
|
sorbet-runtime
|
104
122
|
spoom
|
123
|
+
standard
|
124
|
+
standard-sorbet
|
105
125
|
tapioca
|
106
126
|
|
107
127
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -127,6 +127,29 @@ res = retrieve_user(user_id)
|
|
127
127
|
|
128
128
|
If the above chain does not fail, the `puts` statement is never run. If the chain does yield a `Failure`, the `puts` block is executed and the `Failure` is ultimately returned.
|
129
129
|
|
130
|
+
### Testing
|
131
|
+
|
132
|
+
We ship with a few Minitest assertions that can be used to easily verify Results.
|
133
|
+
|
134
|
+
```ruby
|
135
|
+
# test_helper.rb
|
136
|
+
|
137
|
+
require "minitest/results_assertions"
|
138
|
+
# You also need add this to `sorbet/tapioca/require.rb` and rebuild the Minitest gem RBIs
|
139
|
+
|
140
|
+
# *_test.rb
|
141
|
+
|
142
|
+
@success = Typed::Success.new("Test Payload")
|
143
|
+
@failure = Typed::Failure.new("Test Error")
|
144
|
+
|
145
|
+
assert_success(@success)
|
146
|
+
assert_failure(@failure)
|
147
|
+
assert_payload("Test Payload", @success)
|
148
|
+
assert_error("Test Error", @failure)
|
149
|
+
|
150
|
+
# We also have the `refute_*` counterparts
|
151
|
+
```
|
152
|
+
|
130
153
|
## Why use Results?
|
131
154
|
|
132
155
|
Let's say you're working on a method that reaches out to an API and fetches a resource. We hope to get a successful response and continue on in our program, but you can imagine several scenarios where we don't get that response: our authentication could fail, the server could return a 5XX response code, or the resource we were querying could have moved or not exist any more.
|
data/Rakefile
CHANGED
@@ -7,15 +7,13 @@ Minitest::TestTask.create do |t|
|
|
7
7
|
t.test_globs = ["test/**/*_test.rb"]
|
8
8
|
end
|
9
9
|
|
10
|
+
require "standard/rake"
|
11
|
+
|
10
12
|
desc "Test Compiler output"
|
11
13
|
task :compiler do
|
12
14
|
sh "./test/test_type_checker.sh"
|
13
15
|
end
|
14
16
|
|
15
|
-
require "rubocop/rake_task"
|
16
|
-
|
17
|
-
RuboCop::RakeTask.new
|
18
|
-
|
19
17
|
desc "Run tapioca compilers"
|
20
18
|
task :tapioca do
|
21
19
|
sh "bin/tapioca gem"
|
@@ -26,4 +24,4 @@ task :sorbet do
|
|
26
24
|
sh "bundle exec srb tc"
|
27
25
|
end
|
28
26
|
|
29
|
-
task default: %i[
|
27
|
+
task default: %i[standard:fix_unsafely sorbet test compiler]
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# typed: true
|
2
|
+
|
3
|
+
require "minitest/assertions"
|
4
|
+
require "sorbet-result"
|
5
|
+
|
6
|
+
module Minitest
|
7
|
+
module Assertions
|
8
|
+
# Fails unless Result is a Success
|
9
|
+
def assert_success(result)
|
10
|
+
assert_kind_of(Typed::Success, result)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Fails unless Result is a Failure
|
14
|
+
def assert_failure(result)
|
15
|
+
assert_kind_of(Typed::Failure, result)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Fails unless exp is equal to payload
|
19
|
+
def assert_payload(exp, result)
|
20
|
+
assert_equal(exp, result.payload)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Fails unless exp is equal to error
|
24
|
+
def assert_error(exp, result)
|
25
|
+
assert_equal(exp, result.error)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Fails if Result is a Success
|
29
|
+
def refute_success(result)
|
30
|
+
refute_kind_of(Typed::Success, result)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Fails if Result is a Failure
|
34
|
+
def refute_failure(result)
|
35
|
+
refute_kind_of(Typed::Failure, result)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Fails if exp is equal to payload
|
39
|
+
def refute_payload(exp, result)
|
40
|
+
refute_equal(exp, result.payload)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Fails if exp is equal to error
|
44
|
+
def refute_error(exp, result)
|
45
|
+
refute_equal(exp, result.error)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/sorbet-result.rb
CHANGED
@@ -4,11 +4,7 @@
|
|
4
4
|
# frozen_string_literal: true
|
5
5
|
|
6
6
|
require "sorbet-runtime"
|
7
|
-
|
7
|
+
require_relative "typed/result"
|
8
8
|
|
9
9
|
# Sorbet-aware namespace to super-charge your projects
|
10
10
|
module Typed; end
|
11
|
-
|
12
|
-
loader = Zeitwerk::Loader.new
|
13
|
-
loader.push_dir("#{__dir__}/typed", namespace: Typed)
|
14
|
-
loader.setup
|
data/lib/typed/result.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# typed: strict
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require_relative "no_error_on_success_error"
|
5
|
+
require_relative "no_payload_on_failure_error"
|
6
|
+
|
4
7
|
module Typed
|
5
8
|
# A monad representing either a success or a failure. Contains payload and error information as well.
|
6
9
|
class Result
|
@@ -9,21 +12,26 @@ module Typed
|
|
9
12
|
extend T::Generic
|
10
13
|
|
11
14
|
abstract!
|
15
|
+
sealed!
|
12
16
|
|
13
17
|
Payload = type_member(:out)
|
14
18
|
Error = type_member(:out)
|
15
19
|
|
16
20
|
sig { abstract.returns(T::Boolean) }
|
17
|
-
def success
|
21
|
+
def success?
|
22
|
+
end
|
18
23
|
|
19
24
|
sig { abstract.returns(T::Boolean) }
|
20
|
-
def failure
|
25
|
+
def failure?
|
26
|
+
end
|
21
27
|
|
22
28
|
sig { abstract.returns(Payload) }
|
23
|
-
def payload
|
29
|
+
def payload
|
30
|
+
end
|
24
31
|
|
25
32
|
sig { abstract.returns(Error) }
|
26
|
-
def error
|
33
|
+
def error
|
34
|
+
end
|
27
35
|
|
28
36
|
sig do
|
29
37
|
abstract
|
@@ -31,14 +39,16 @@ module Typed
|
|
31
39
|
.params(_block: T.proc.params(arg0: Payload).returns(Result[T.type_parameter(:U), T.type_parameter(:T)]))
|
32
40
|
.returns(T.any(Result[T.type_parameter(:U), T.type_parameter(:T)], Result[T.type_parameter(:U), Error]))
|
33
41
|
end
|
34
|
-
def and_then(&_block)
|
42
|
+
def and_then(&_block)
|
43
|
+
end
|
35
44
|
|
36
45
|
sig do
|
37
46
|
abstract
|
38
47
|
.params(block: T.proc.params(arg0: Error).void)
|
39
48
|
.returns(T.self_type)
|
40
49
|
end
|
41
|
-
def on_error(&block)
|
50
|
+
def on_error(&block)
|
51
|
+
end
|
42
52
|
|
43
53
|
sig do
|
44
54
|
abstract
|
@@ -46,6 +56,158 @@ module Typed
|
|
46
56
|
.params(value: T.type_parameter(:Fallback))
|
47
57
|
.returns(T.any(Payload, T.type_parameter(:Fallback)))
|
48
58
|
end
|
49
|
-
def payload_or(value)
|
59
|
+
def payload_or(value)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class Success < Result
|
64
|
+
extend T::Sig
|
65
|
+
extend T::Generic
|
66
|
+
|
67
|
+
Payload = type_member
|
68
|
+
Error = type_member { {fixed: T.noreturn} }
|
69
|
+
|
70
|
+
sig { override.returns(Payload) }
|
71
|
+
attr_reader :payload
|
72
|
+
|
73
|
+
sig do
|
74
|
+
type_parameters(:T)
|
75
|
+
.params(payload: T.type_parameter(:T))
|
76
|
+
.returns(Typed::Success[T.type_parameter(:T)])
|
77
|
+
end
|
78
|
+
def self.new(payload)
|
79
|
+
super(payload)
|
80
|
+
end
|
81
|
+
|
82
|
+
sig { returns(Typed::Success[NilClass]) }
|
83
|
+
def self.blank
|
84
|
+
new(nil)
|
85
|
+
end
|
86
|
+
|
87
|
+
sig { params(payload: Payload).void }
|
88
|
+
def initialize(payload)
|
89
|
+
@payload = payload
|
90
|
+
super()
|
91
|
+
end
|
92
|
+
|
93
|
+
sig { override.returns(T::Boolean) }
|
94
|
+
def success?
|
95
|
+
true
|
96
|
+
end
|
97
|
+
|
98
|
+
sig { override.returns(T::Boolean) }
|
99
|
+
def failure?
|
100
|
+
false
|
101
|
+
end
|
102
|
+
|
103
|
+
sig { override.returns(T.noreturn) }
|
104
|
+
def error
|
105
|
+
raise NoErrorOnSuccessError
|
106
|
+
end
|
107
|
+
|
108
|
+
sig do
|
109
|
+
override
|
110
|
+
.type_parameters(:U, :T)
|
111
|
+
.params(block: T.proc.params(arg0: Payload).returns(Result[T.type_parameter(:U), T.type_parameter(:T)]))
|
112
|
+
.returns(Result[T.type_parameter(:U), T.type_parameter(:T)])
|
113
|
+
end
|
114
|
+
def and_then(&block)
|
115
|
+
block.call(payload)
|
116
|
+
end
|
117
|
+
|
118
|
+
sig do
|
119
|
+
override
|
120
|
+
.params(_block: T.proc.params(arg0: Error).void)
|
121
|
+
.returns(T.self_type)
|
122
|
+
end
|
123
|
+
def on_error(&_block)
|
124
|
+
self
|
125
|
+
end
|
126
|
+
|
127
|
+
sig do
|
128
|
+
override
|
129
|
+
.type_parameters(:Fallback)
|
130
|
+
.params(_value: T.type_parameter(:Fallback))
|
131
|
+
.returns(T.any(Payload, T.type_parameter(:Fallback)))
|
132
|
+
end
|
133
|
+
def payload_or(_value)
|
134
|
+
payload
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
class Failure < Result
|
139
|
+
extend T::Sig
|
140
|
+
extend T::Generic
|
141
|
+
|
142
|
+
Payload = type_member { {fixed: T.noreturn} }
|
143
|
+
Error = type_member
|
144
|
+
|
145
|
+
sig { override.returns(Error) }
|
146
|
+
attr_reader :error
|
147
|
+
|
148
|
+
sig do
|
149
|
+
type_parameters(:T)
|
150
|
+
.params(error: T.type_parameter(:T))
|
151
|
+
.returns(Typed::Failure[T.type_parameter(:T)])
|
152
|
+
end
|
153
|
+
def self.new(error)
|
154
|
+
super(error)
|
155
|
+
end
|
156
|
+
|
157
|
+
sig { returns(Typed::Failure[NilClass]) }
|
158
|
+
def self.blank
|
159
|
+
new(nil)
|
160
|
+
end
|
161
|
+
|
162
|
+
sig { params(error: Error).void }
|
163
|
+
def initialize(error)
|
164
|
+
@error = error
|
165
|
+
super()
|
166
|
+
end
|
167
|
+
|
168
|
+
sig { override.returns(T::Boolean) }
|
169
|
+
def success?
|
170
|
+
false
|
171
|
+
end
|
172
|
+
|
173
|
+
sig { override.returns(T::Boolean) }
|
174
|
+
def failure?
|
175
|
+
true
|
176
|
+
end
|
177
|
+
|
178
|
+
sig { override.returns(T.noreturn) }
|
179
|
+
def payload
|
180
|
+
raise NoPayloadOnFailureError
|
181
|
+
end
|
182
|
+
|
183
|
+
sig do
|
184
|
+
override
|
185
|
+
.type_parameters(:U, :T)
|
186
|
+
.params(_block: T.proc.params(arg0: Payload).returns(Result[T.type_parameter(:U), T.type_parameter(:T)]))
|
187
|
+
.returns(Result[T.type_parameter(:U), Error])
|
188
|
+
end
|
189
|
+
def and_then(&_block)
|
190
|
+
self
|
191
|
+
end
|
192
|
+
|
193
|
+
sig do
|
194
|
+
override
|
195
|
+
.params(block: T.proc.params(arg0: Error).void)
|
196
|
+
.returns(T.self_type)
|
197
|
+
end
|
198
|
+
def on_error(&block)
|
199
|
+
block.call(error)
|
200
|
+
self
|
201
|
+
end
|
202
|
+
|
203
|
+
sig do
|
204
|
+
override
|
205
|
+
.type_parameters(:Fallback)
|
206
|
+
.params(value: T.type_parameter(:Fallback))
|
207
|
+
.returns(T.any(Payload, T.type_parameter(:Fallback)))
|
208
|
+
end
|
209
|
+
def payload_or(value)
|
210
|
+
value
|
211
|
+
end
|
50
212
|
end
|
51
213
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
**/*.rbi linguist-generated=true
|