Skip to content

Commit ac68691

Browse files
committed
Add FlatMapValidation to Validation type
Signed-off-by: Guillaume Lours <[email protected]>
1 parent ec1755c commit ac68691

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

api/control/validation.go2

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,15 @@ func MapErrorValidation[E, T, U any](validation Validation[E, T], mapper func(E)
5858
return Valid[U, T]{validation.OrElse(*new(T))}
5959
}
6060

61+
// FlatMapValidation maps the valid value of a Validation[E, T] to a new Validation with a valid element of type U.
62+
// the mapper function should take a T value and return a Validation[E, U] value.
63+
func FlatMapValidation[E, T, U any](validation Validation[E, T], mapper func(T) Validation[E, U]) Validation[E, U] {
64+
if validation.IsValid() {
65+
return mapper(validation.OrElse(*new(T)))
66+
}
67+
return Invalid[E, U]{validation.ErrorOrElse(*new(E))}
68+
}
69+
6170
// Valid is an implementation of Validation with a valid T value.
6271
type Valid[E, T any] struct {
6372
value T

api/control/validation_test.go2

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -161,12 +161,12 @@ func TestMapValidation(t *testing.T) {
161161
var mapper = func(value int) string {
162162
return strconv.Itoa(value)
163163
}
164-
var mapValid Validation[error, string] = MapValidation[error, int, string](valid, mapper)
164+
var mapValid = MapValidation[error, int, string](valid, mapper)
165165
if mapValid.OrElse("good") != "10" {
166166
t.Errorf("value should be 10")
167167
}
168168

169-
var mapInvalid Validation[error, string] = MapValidation[error, int, string](invalid, mapper)
169+
var mapInvalid = MapValidation[error, int, string](invalid, mapper)
170170
if mapInvalid.IsValid() {
171171
t.Errorf("should be an Invalid Validation")
172172
}
@@ -176,13 +176,28 @@ func TestMapErrorValidation(t *testing.T) {
176176
var mapper = func(value error) string {
177177
return value.Error()
178178
}
179-
var mapErrorValid Validation[string, int] = MapErrorValidation[error, int, string](valid, mapper)
179+
var mapErrorValid = MapErrorValidation[error, int, string](valid, mapper)
180180
if mapErrorValid.OrElse(20) != 10 {
181181
t.Errorf("value should be 10")
182182
}
183183

184-
var mapInvalid Validation[string, int] = MapErrorValidation[error, int, string](invalid, mapper)
184+
var mapInvalid = MapErrorValidation[error, int, string](invalid, mapper)
185185
if mapInvalid.IsValid() {
186186
t.Errorf("should be an Invalid Validation")
187187
}
188-
}
188+
}
189+
190+
func TestFlatMapValidation(t *testing.T) {
191+
var mapper = func(value int) Validation[error, string] {
192+
return ValidOf[error, string](strconv.Itoa(value))
193+
}
194+
var flatMapValid = FlatMapValidation(valid, mapper)
195+
if flatMapValid.OrElse("good") != "10" {
196+
t.Errorf("value should be 10")
197+
}
198+
199+
var flatMapInvalid = FlatMapValidation(invalid, mapper)
200+
if flatMapInvalid.IsValid() {
201+
t.Errorf("should be an Invalid Validation")
202+
}
203+
}

0 commit comments

Comments
 (0)