sorbet-result 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.standard.yml +6 -0
  4. data/.tool-versions +1 -1
  5. data/CHANGELOG.md +10 -0
  6. data/Gemfile +2 -4
  7. data/Gemfile.lock +75 -55
  8. data/README.md +23 -0
  9. data/Rakefile +3 -5
  10. data/lib/minitest/result_assertions.rb +48 -0
  11. data/lib/sorbet-result.rb +1 -5
  12. data/lib/typed/result.rb +169 -7
  13. data/sorbet/rbi/gems/.gitattributes +1 -0
  14. data/sorbet/rbi/gems/erubi@1.12.0.rbi +145 -0
  15. data/sorbet/rbi/gems/{json@2.6.3.rbi → json@2.7.1.rbi} +80 -60
  16. data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14237 -0
  17. data/sorbet/rbi/gems/lint_roller@1.1.0.rbi +239 -0
  18. data/sorbet/rbi/gems/{minitest@5.18.1.rbi → minitest@5.22.2.rbi} +285 -241
  19. data/sorbet/rbi/gems/{parallel@1.23.0.rbi → parallel@1.24.0.rbi} +8 -1
  20. data/sorbet/rbi/gems/{parser@3.2.2.3.rbi → parser@3.3.0.5.rbi} +438 -2219
  21. data/sorbet/rbi/gems/prettier_print@1.2.1.rbi +951 -0
  22. data/sorbet/rbi/gems/prism@0.24.0.rbi +31040 -0
  23. data/sorbet/rbi/gems/psych@5.1.2.rbi +1731 -0
  24. data/sorbet/rbi/gems/{racc@1.7.1.rbi → racc@1.7.3.rbi} +35 -39
  25. data/sorbet/rbi/gems/{rake@13.0.6.rbi → rake@13.1.0.rbi} +68 -65
  26. data/sorbet/rbi/gems/{rbi@0.0.16.rbi → rbi@0.1.9.rbi} +712 -714
  27. data/sorbet/rbi/gems/{regexp_parser@2.8.1.rbi → regexp_parser@2.9.0.rbi} +187 -165
  28. data/sorbet/rbi/gems/{rexml@3.2.5.rbi → rexml@3.2.6.rbi} +116 -52
  29. data/sorbet/rbi/gems/{rubocop-ast@1.29.0.rbi → rubocop-ast@1.30.0.rbi} +77 -77
  30. data/sorbet/rbi/gems/rubocop-performance@1.20.2.rbi +8 -0
  31. data/sorbet/rbi/gems/rubocop-sorbet@0.7.7.rbi +8 -0
  32. data/sorbet/rbi/gems/{rubocop@1.52.1.rbi → rubocop@1.60.2.rbi} +3593 -1700
  33. data/sorbet/rbi/gems/{spoom@1.2.1.rbi → spoom@1.2.4.rbi} +1378 -104
  34. data/sorbet/rbi/gems/standard-custom@1.0.2.rbi +8 -0
  35. data/sorbet/rbi/gems/standard-performance@1.3.1.rbi +8 -0
  36. data/sorbet/rbi/gems/standard-sorbet@0.0.2.rbi +52 -0
  37. data/sorbet/rbi/gems/standard@1.34.0.rbi +850 -0
  38. data/sorbet/rbi/gems/stringio@3.1.0.rbi +8 -0
  39. data/sorbet/rbi/gems/syntax_tree@6.2.0.rbi +23133 -0
  40. data/sorbet/rbi/gems/{tapioca@0.11.6.rbi → tapioca@0.12.0.rbi} +776 -574
  41. data/sorbet/rbi/gems/{thor@1.2.2.rbi → thor@1.3.0.rbi} +775 -395
  42. data/sorbet/rbi/gems/yard-sorbet@0.8.1.rbi +1 -1
  43. data/sorbet/rbi/gems/yard@0.9.34.rbi +2 -2
  44. data/sorbet/tapioca/config.yml +3 -12
  45. data/sorbet/tapioca/require.rb +0 -1
  46. metadata +41 -34
  47. data/.rubocop.yml +0 -33
  48. data/lib/typed/failure.rb +0 -81
  49. data/lib/typed/success.rb +0 -80
  50. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +0 -1083
  51. data/sorbet/rbi/gems/irb@1.7.0.rbi +0 -342
  52. data/sorbet/rbi/gems/rubocop-minitest@0.31.0.rbi +0 -2528
  53. data/sorbet/rbi/gems/rubocop-rake@0.6.0.rbi +0 -328
  54. data/sorbet/rbi/gems/rubocop-sorbet@0.7.0.rbi +0 -1043
  55. data/sorbet/rbi/gems/unparser@0.6.8.rbi +0 -4525
  56. data/sorbet/rbi/gems/zeitwerk@2.6.8.rbi +0 -986
  57. /data/sorbet/rbi/gems/{io-console@0.6.0.rbi → io-console@0.7.2.rbi} +0 -0
  58. /data/sorbet/rbi/gems/{reline@0.3.5.rbi → reline@0.4.2.rbi} +0 -0
  59. /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: 79770af90bc94993111e0e11b8d4dfcf7660d19e878a1f55642e607fcc6db579
4
- data.tar.gz: eb5c66753067b295ed7750aec1a0de64630c9f0fe5d5f5e3f20b5f3d66b33de2
3
+ metadata.gz: 94d11199cfc745364d1c1163b60f8a1602699f136f5c6522dfa7a81f64d6f8b1
4
+ data.tar.gz: b867a4439f5a0e5f8335848c42599563149b950a42e54495cbbe1c38b8d4c60d
5
5
  SHA512:
6
- metadata.gz: 75311c18528aa78e426b0f497d4a5d6bb69dc859811b1bfe27201df062422243f2ba091c232141baa13d8a5092e10dc52d11e6e3654b7bc47979e0d88a306e63
7
- data.tar.gz: 0e76944518d89dfa80d5025590ccb4c6867977edcf4ae626f155a5b8ce8cc1e52b1a8d61186e9e24c9d0d13af9fca51612374a178ef91ebe6ef672bd9b59efd1
6
+ metadata.gz: 73a6915ad1ca43e1bc729f4be2d0b7bec3c5dcacce072e96074b0d8ce98b9033ffcbdc254b743e10e5156bac08d418d912f45ea50f83c571774c3419f449f6e9
7
+ data.tar.gz: 18d8c8f3921cb4d60fde19d8270281f67de8d39aecb57830b8eb6c79e96fdfe5ac18b3ca056e7c265ede393ba91e180d078b9b0aa9396ff4a92f917b26d8819f
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.2.2
1
+ 3.3.0
data/.standard.yml ADDED
@@ -0,0 +1,6 @@
1
+ parallel: true
2
+ ruby_version: 3.0
3
+ ignore:
4
+ - 'vendor/**/*'
5
+ plugins:
6
+ - standard-sorbet
data/.tool-versions CHANGED
@@ -1 +1 @@
1
- ruby 3.2.2
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
@@ -7,10 +7,8 @@ gemspec
7
7
 
8
8
  group :development do
9
9
  gem "rake"
10
- gem "rubocop"
11
- gem "rubocop-minitest"
12
- gem "rubocop-rake"
13
- gem "rubocop-sorbet"
10
+ gem "standard"
11
+ gem "standard-sorbet"
14
12
  gem "sorbet"
15
13
  gem "spoom"
16
14
  gem "tapioca", require: false
data/Gemfile.lock CHANGED
@@ -1,107 +1,127 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sorbet-result (1.0.0)
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.8.0)
13
- irb (>= 1.5.0)
14
- reline (>= 0.3.1)
15
- diff-lcs (1.5.0)
16
- io-console (0.6.0)
17
- irb (1.7.0)
18
- reline (>= 0.3.0)
19
- json (2.6.3)
20
- minitest (5.18.1)
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.0)
23
- parser (3.2.2.3)
24
+ parallel (1.24.0)
25
+ parser (3.3.0.5)
24
26
  ast (~> 2.4.1)
25
27
  racc
26
- racc (1.7.1)
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.6)
29
- rbi (0.0.16)
30
- ast
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
- unparser
34
- regexp_parser (2.8.1)
35
- reline (0.3.5)
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.5)
38
- rubocop (1.52.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.2.2.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.28.0, < 2.0)
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.29.0)
55
+ rubocop-ast (1.30.0)
49
56
  parser (>= 3.2.1.0)
50
- rubocop-minitest (0.31.0)
51
- rubocop (>= 1.39, < 2.0)
52
- rubocop-rake (0.6.0)
53
- rubocop (~> 1.0)
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.10880)
58
- sorbet-static (= 0.5.10880)
59
- sorbet-runtime (0.5.10880)
60
- sorbet-static (0.5.10880-universal-darwin-22)
61
- sorbet-static (0.5.10880-x86_64-linux)
62
- sorbet-static-and-runtime (0.5.10880)
63
- sorbet (= 0.5.10880)
64
- sorbet-runtime (= 0.5.10880)
65
- spoom (1.2.1)
66
- sorbet (>= 0.5.10187)
67
- sorbet-runtime (>= 0.5.9204)
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
- tapioca (0.11.6)
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 (~> 0.0.0, >= 0.0.16)
74
- sorbet-static-and-runtime (>= 0.5.10187)
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.2.2)
79
- unicode-display_width (2.4.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[rubocop:autocorrect_all sorbet test compiler]
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
- require "zeitwerk"
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?; end
21
+ def success?
22
+ end
18
23
 
19
24
  sig { abstract.returns(T::Boolean) }
20
- def failure?; end
25
+ def failure?
26
+ end
21
27
 
22
28
  sig { abstract.returns(Payload) }
23
- def payload; end
29
+ def payload
30
+ end
24
31
 
25
32
  sig { abstract.returns(Error) }
26
- def error; end
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); end
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); end
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); end
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