diff --git a/option/option.go b/option/option.go new file mode 100644 index 0000000..ebce66e --- /dev/null +++ b/option/option.go @@ -0,0 +1,31 @@ +package option + +// Option permet de définir des valeurs optionnelles, afin de se passer de nil. +type Option[T any] struct { + v T + ok bool +} + +// Some retourne une valeur optionnelle existante. +func Some[T any](v T) (o Option[T]) { + o.v, o.ok = v, true + return +} + +// None retourne une option vide. +func None[T any]() (o Option[T]) { + return +} + +// Get retourne la valeur de l’option et un booléen pour dire si elle est initialisée ou non. +func (o Option[T]) Get() (v T, ok bool) { + if ok = o.ok; ok { + v = o.v + } + return +} + +// IsDefined retourne vrai si l’option est initialisée. +func (o Option[T]) IsDefined() bool { + return o.ok +} diff --git a/option/result.go b/option/result.go new file mode 100644 index 0000000..ba63397 --- /dev/null +++ b/option/result.go @@ -0,0 +1,43 @@ +package option + +// 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 +}