unexceptional 0.0.0 → 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 +4 -4
- data/lib/unexceptional.rb +46 -22
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a58647357380db24012ea25d40324d424945a1b
|
4
|
+
data.tar.gz: 4bf5b4de747ad3997d294bed098d50ef93edf01b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81babf8e262b1eb60f465c1fc448b92743078ec02906926c8ac4d8b920151d9710d9b51118fc66c075b835d536f9562f837ca6aa83b41e008e57c48ed5759389
|
7
|
+
data.tar.gz: 4c98a50902b60294a98dd1b2b33bddd37c443c6bb42038ab6bd268849f439cb8503b5615c6163c89dcde189aa33cb7dab1f67432f185b0dbbbdadafa5f5e6e43
|
data/lib/unexceptional.rb
CHANGED
@@ -1,21 +1,21 @@
|
|
1
1
|
module Unexceptional
|
2
2
|
class Result
|
3
|
-
# Pass true or false and an error value. If the first argument is true
|
4
|
-
# Result
|
5
|
-
# value.
|
3
|
+
# Pass true or false and an error value. If the first argument is `true`, returns an
|
4
|
+
# ok `Result`. If the first argument is false, returns an err `Result` wrapping the
|
5
|
+
# error value.
|
6
6
|
def self.check(condition, error)
|
7
7
|
condition ? ok : err(error)
|
8
8
|
end
|
9
9
|
|
10
|
-
# Returns a new Result respresenting failure.
|
10
|
+
# Returns a new `Result` respresenting failure. Accepts an optional error value.
|
11
11
|
def self.err(err)
|
12
12
|
new false, nil, err
|
13
13
|
end
|
14
14
|
|
15
15
|
# Pass a block and a collection. The block must accept a member of the collection and
|
16
|
-
# return a Result
|
16
|
+
# return a `Result`.
|
17
17
|
#
|
18
|
-
# If all members succeed, returns a Result wrapping all the mapped members:
|
18
|
+
# If all members succeed, returns a `Result` wrapping all the mapped members:
|
19
19
|
#
|
20
20
|
# Result.map([1, 2]) do |i|
|
21
21
|
# Result.ok i * 2
|
@@ -47,14 +47,14 @@ module Unexceptional
|
|
47
47
|
)
|
48
48
|
end
|
49
49
|
|
50
|
-
# Returns a new Result respresenting success.
|
50
|
+
# Returns a new `Result` respresenting success. Accepts an optional result value.
|
51
51
|
def self.ok(val = nil)
|
52
52
|
new true, val, nil
|
53
53
|
end
|
54
54
|
|
55
|
-
# Given a block, runs an ActiveRecord transaction. The block must return a Result
|
56
|
-
# the Result is an error, rolls back the transaction. Either way, returns the
|
57
|
-
# You must call `require 'active_record` before you call this method.
|
55
|
+
# Given a block, runs an ActiveRecord transaction. The block must return a `Result`.
|
56
|
+
# If the `Result` is an error, rolls back the transaction. Either way, returns the
|
57
|
+
# `Result`. You must call `require 'active_record'` before you call this method.
|
58
58
|
def self.transaction
|
59
59
|
unless defined?(ActiveRecord)
|
60
60
|
raise 'ActiveRecord is not defined'
|
@@ -70,8 +70,8 @@ module Unexceptional
|
|
70
70
|
end
|
71
71
|
|
72
72
|
# Tries to run a list of procs, aborting on the first failure, if any. Each proc must
|
73
|
-
# return a Result
|
74
|
-
# failed Result
|
73
|
+
# return a `Result`--either ok or err. Aborts on the first err, if any, returning the
|
74
|
+
# failed `Result`. If all procs return ok, returns the last `Result`.
|
75
75
|
#
|
76
76
|
# Result.try(
|
77
77
|
# -> { Result.ok 2 },
|
@@ -93,18 +93,32 @@ module Unexceptional
|
|
93
93
|
# ->((a, b)) { Result.ok a + b }
|
94
94
|
# )
|
95
95
|
# # => Result.ok(3)
|
96
|
+
#
|
97
|
+
# If you need to initialize a lot of objects along the way, passing them through the
|
98
|
+
# various procs via pattern-matching can be unwieldy. In that case, you can use the
|
99
|
+
# `#set` method along with instance variables:
|
100
|
+
#
|
101
|
+
# Result.try(
|
102
|
+
# -> { @a = Result.ok 2 },
|
103
|
+
# -> { @b = Result.ok @a * 3 },
|
104
|
+
# -> { Result.ok(@b * 4) }
|
105
|
+
# )
|
106
|
+
# # => Result.ok(24)
|
96
107
|
def self.try(*procs)
|
97
108
|
if procs.empty?
|
98
109
|
raise 'Must past at least one proc to Result.try'
|
99
110
|
end
|
111
|
+
ctx = TryContext.new
|
100
112
|
procs.inject(nil) do |last_result, proc|
|
101
113
|
if last_result.nil?
|
102
|
-
proc
|
114
|
+
ctx.instance_exec(&proc)
|
115
|
+
elsif !last_result.is_a?(Result)
|
116
|
+
raise "Each proc in Result.try must return a Result, but proc returned #{last_result.inspect}"
|
103
117
|
elsif last_result.ok?
|
104
118
|
if proc.parameters.length == 0
|
105
|
-
proc
|
119
|
+
ctx.instance_exec(&proc)
|
106
120
|
else
|
107
|
-
|
121
|
+
ctx.instance_exec(last_result.unwrap, &proc)
|
108
122
|
end
|
109
123
|
else
|
110
124
|
last_result
|
@@ -112,14 +126,14 @@ module Unexceptional
|
|
112
126
|
end
|
113
127
|
end
|
114
128
|
|
115
|
-
# If this Result is an err, returns self:
|
129
|
+
# If this `Result` is an err, returns self:
|
116
130
|
#
|
117
131
|
# Result
|
118
132
|
# .err(:uh_oh)
|
119
133
|
# .and_then { 'This block never executes' }
|
120
134
|
# # => Result.err(:uh_oh)
|
121
135
|
#
|
122
|
-
# If this Result is ok, then the behavior depends on what you passed to `and_then`:
|
136
|
+
# If this `Result` is ok, then the behavior depends on what you passed to `and_then`:
|
123
137
|
#
|
124
138
|
# # Passing a single argument:
|
125
139
|
# Result
|
@@ -152,19 +166,19 @@ module Unexceptional
|
|
152
166
|
end
|
153
167
|
end
|
154
168
|
|
155
|
-
# Yields this Result if this Result is an err.
|
169
|
+
# Yields this `Result` if this `Result` is an err.
|
156
170
|
def if_err
|
157
171
|
yield self.err if !@ok
|
158
172
|
self
|
159
173
|
end
|
160
174
|
|
161
|
-
# Yields this Result if this Result is ok.
|
175
|
+
# Yields this `Result` if this Result is ok.
|
162
176
|
def if_ok
|
163
177
|
yield self.val if @ok
|
164
178
|
self
|
165
179
|
end
|
166
180
|
|
167
|
-
# Returns the
|
181
|
+
# Returns the inner err value. Raises if this `Result` is ok.
|
168
182
|
def err
|
169
183
|
if !@ok
|
170
184
|
@err
|
@@ -183,13 +197,13 @@ module Unexceptional
|
|
183
197
|
@val = val
|
184
198
|
@err = err
|
185
199
|
end
|
186
|
-
|
200
|
+
|
187
201
|
# Returns true if this Result is ok, false if this Result is an err.
|
188
202
|
def ok?
|
189
203
|
@ok
|
190
204
|
end
|
191
205
|
|
192
|
-
# Returns the
|
206
|
+
# Returns the inner success value. Raises if this Result is an err.
|
193
207
|
def unwrap
|
194
208
|
if @ok
|
195
209
|
@val
|
@@ -197,5 +211,15 @@ module Unexceptional
|
|
197
211
|
raise "Called #unwrap on error: #{@err.inspect}"
|
198
212
|
end
|
199
213
|
end
|
214
|
+
alias_method :ok, :unwrap
|
215
|
+
end
|
216
|
+
|
217
|
+
class TryContext #:nodoc:
|
218
|
+
def set(var, result)
|
219
|
+
if result.ok?
|
220
|
+
instance_variable_set '@' + var.to_s, result.unwrap
|
221
|
+
end
|
222
|
+
result
|
223
|
+
end
|
200
224
|
end
|
201
225
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: unexceptional
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jarrett Colby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|