aboutsummaryrefslogtreecommitdiffstats
path: root/modules/optional
diff options
context:
space:
mode:
Diffstat (limited to 'modules/optional')
-rw-r--r--modules/optional/option.go13
-rw-r--r--modules/optional/option_test.go6
-rw-r--r--modules/optional/serialization_test.go2
3 files changed, 20 insertions, 1 deletions
diff --git a/modules/optional/option.go b/modules/optional/option.go
index ccbad259c2..cbecf86987 100644
--- a/modules/optional/option.go
+++ b/modules/optional/option.go
@@ -5,6 +5,12 @@ package optional
import "strconv"
+// Option is a generic type that can hold a value of type T or be empty (None).
+//
+// It must use the slice type to work with "chi" form values binding:
+// * non-existing value are represented as an empty slice (None)
+// * existing value is represented as a slice with one element (Some)
+// * multiple values are represented as a slice with multiple elements (Some), the Value is the first element (not well-defined in this case)
type Option[T any] []T
func None[T any]() Option[T] {
@@ -22,6 +28,13 @@ func FromPtr[T any](v *T) Option[T] {
return Some(*v)
}
+func FromMapLookup[K comparable, V any](m map[K]V, k K) Option[V] {
+ if v, ok := m[k]; ok {
+ return Some(v)
+ }
+ return None[V]()
+}
+
func FromNonDefault[T comparable](v T) Option[T] {
var zero T
if v == zero {
diff --git a/modules/optional/option_test.go b/modules/optional/option_test.go
index f600ff5a2c..ea80a2e3cb 100644
--- a/modules/optional/option_test.go
+++ b/modules/optional/option_test.go
@@ -56,6 +56,12 @@ func TestOption(t *testing.T) {
opt3 := optional.FromNonDefault(1)
assert.True(t, opt3.Has())
assert.Equal(t, int(1), opt3.Value())
+
+ opt4 := optional.FromMapLookup(map[string]int{"a": 1}, "a")
+ assert.True(t, opt4.Has())
+ assert.Equal(t, 1, opt4.Value())
+ opt4 = optional.FromMapLookup(map[string]int{"a": 1}, "b")
+ assert.False(t, opt4.Has())
}
func Test_ParseBool(t *testing.T) {
diff --git a/modules/optional/serialization_test.go b/modules/optional/serialization_test.go
index 21d3ad8470..cf81a94cfc 100644
--- a/modules/optional/serialization_test.go
+++ b/modules/optional/serialization_test.go
@@ -4,7 +4,7 @@
package optional_test
import (
- std_json "encoding/json" //nolint:depguard
+ std_json "encoding/json" //nolint:depguard // for testing purpose
"testing"
"code.gitea.io/gitea/modules/json"