2023-09-23 10:28:10 +00:00
|
|
|
|
package option
|
|
|
|
|
|
2024-02-21 09:10:49 +00:00
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
)
|
|
|
|
|
|
2023-09-23 10:28:10 +00:00
|
|
|
|
// Result stocke un résultat :
|
|
|
|
|
// - soit le résultat est valide, et une valeur est stockée,
|
|
|
|
|
// - soit le résultat est invalide, et une erreur est stockée.
|
|
|
|
|
type Result[T any] struct {
|
|
|
|
|
v T
|
|
|
|
|
err error
|
|
|
|
|
ok bool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ok retourne un résultat valide.
|
|
|
|
|
func Ok[T any](v T) (r Result[T]) {
|
|
|
|
|
r.v, r.ok = v, true
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Err retourne un résultat invalide.
|
|
|
|
|
func Err[T any](err error) (r Result[T]) {
|
|
|
|
|
r.err = err
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Ok retourne la valeur du résultat, et vrai si c’est un résultat valide.
|
|
|
|
|
func (r Result[T]) Ok() (v T, ok bool) {
|
|
|
|
|
if ok = r.ok; ok {
|
|
|
|
|
v = r.v
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Err retourne l’erreur du résultat, et vrai si c’est un résultat invalide.
|
|
|
|
|
func (r Result[T]) Err() (err error, ok bool) {
|
|
|
|
|
if ok = !r.ok; ok {
|
|
|
|
|
err = r.err
|
|
|
|
|
}
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// IsOk retourne vrai si le résultat est valide.
|
|
|
|
|
func (r Result[T]) IsOk() bool {
|
|
|
|
|
return r.ok
|
|
|
|
|
}
|
2024-02-21 09:10:49 +00:00
|
|
|
|
|
|
|
|
|
func (r Result[T]) String() string {
|
|
|
|
|
return fmt.Sprintf(`{
|
|
|
|
|
value: %v,
|
|
|
|
|
error: %s,
|
|
|
|
|
ok: %v,
|
|
|
|
|
}`, r.v, r.err, r.ok)
|
|
|
|
|
}
|