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.
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