Skip to content

Commit d118fff

Browse files
authored
Merge branch 'master' into assign-result
2 parents 260c33c + 13e55ed commit d118fff

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

stew/results.nim

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1102,3 +1102,49 @@ template `?`*[T, E](self: Result[T, E]): auto =
11021102

11031103
when not(T is void):
11041104
v.vResultPrivate
1105+
1106+
# Collection integration
1107+
1108+
iterator values*[T, E](self: Result[T, E]): T =
1109+
## Iterate over a Result as a 0/1-item collection, returning its value if set
1110+
if self.oResultPrivate:
1111+
yield self.vResultPrivate
1112+
1113+
iterator errors*[T, E](self: Result[T, E]): E =
1114+
## Iterate over a Result as a 0/1-item collection, returning its error if set
1115+
if not self.oResultPrivate:
1116+
yield self.eResultPrivate
1117+
1118+
iterator items*[T](self: Opt[T]): T =
1119+
## Iterate over an Opt as a 0/1-item collection, returning its value if set
1120+
if self.oResultPrivate:
1121+
yield self.vResultPrivate
1122+
1123+
iterator mvalues*[T, E](self: var Result[T, E]): var T =
1124+
if self.oResultPrivate:
1125+
yield self.vResultPrivate
1126+
1127+
iterator merrors*[T, E](self: var Result[T, E]): var E =
1128+
if not self.oResultPrivate:
1129+
yield self.eResultPrivate
1130+
1131+
iterator mitems*[T](self: var Opt[T]): var T =
1132+
if self.oResultPrivate:
1133+
yield self.vResultPrivate
1134+
1135+
func containsValue*(self: Result, v: auto): bool =
1136+
## Return true iff the given result is set to a value that equals `v`
1137+
self.oResultPrivate and self.vResultPrivate == v
1138+
1139+
func containsError*(self: Result, e: auto): bool =
1140+
## Return true iff the given result is set to an error that equals `e`
1141+
not self.oResultPrivate and self.eResultPrivate == e
1142+
1143+
func contains*(self: Opt, v: auto): bool =
1144+
## Return true iff the given `Opt` is set to a value that equals `v` - can
1145+
## also be used in the "infix" `in` form:
1146+
##
1147+
## ```nim
1148+
## assert "value" in Opt.some("value")
1149+
## ```
1150+
self.oResultPrivate and self.vResultPrivate == v

tests/test_results.nim

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,37 @@ block:
199199
doAssert rOk.filter(proc(x: int): auto = Result[void, string].err("filter")).error == "filter"
200200
doAssert rErr.filter(proc(x: int): auto = Result[void, string].err("filter")) == rErr
201201

202+
# Collections
203+
block:
204+
var i = 0
205+
for v in rOk.values:
206+
doAssert v == rOk.value()
207+
i += 1
208+
doAssert i == 1
209+
210+
for v in rOk.errors:
211+
raiseAssert "not an error"
212+
213+
doAssert rOk.containsValue(rOk.value())
214+
doAssert not rOk.containsValue(rOk.value() + 1)
215+
216+
doAssert not rOk.containsError("test")
217+
218+
block:
219+
var i = 0
220+
for v in rErr.values:
221+
raiseAssert "not a value"
222+
223+
for v in rErr.errors:
224+
doAssert v == rErr.error()
225+
i += 1
226+
doAssert i == 1
227+
228+
doAssert rErr.containsError(rErr.error())
229+
doAssert not rErr.containsError(rErr.error() & "X")
230+
231+
doAssert not rErr.containsValue(42)
232+
202233
# Exception conversions - toException must not be inside a block
203234
type
204235
AnEnum = enum
@@ -381,6 +412,17 @@ block: # Result[T, void] aka `Opt`
381412
doAssert oOk.orErr("error").value() == oOk.get()
382413
doAssert oErr.orErr("error").error() == "error"
383414

415+
# Collections
416+
block:
417+
var i = 0
418+
for v in oOk:
419+
doAssert v == oOk.value()
420+
i += 1
421+
doAssert i == 1
422+
423+
doAssert oOk.value() in oOk
424+
doAssert oOk.value() + 1 notin oOk
425+
384426
block: # `cstring` dangling reference protection
385427
type CSRes = Result[void, cstring]
386428

0 commit comments

Comments
 (0)