summaryrefslogtreecommitdiffstats
path: root/modules/validation/validatable.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel@debian.org>2024-10-18 20:33:49 +0200
committerDaniel Baumann <daniel@debian.org>2024-12-12 23:57:56 +0100
commite68b9d00a6e05b3a941f63ffb696f91e554ac5ec (patch)
tree97775d6c13b0f416af55314eb6a89ef792474615 /modules/validation/validatable.go
parentInitial commit. (diff)
downloadforgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.tar.xz
forgejo-e68b9d00a6e05b3a941f63ffb696f91e554ac5ec.zip
Adding upstream version 9.0.3.
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to 'modules/validation/validatable.go')
-rw-r--r--modules/validation/validatable.go84
1 files changed, 84 insertions, 0 deletions
diff --git a/modules/validation/validatable.go b/modules/validation/validatable.go
new file mode 100644
index 0000000..94b5cc1
--- /dev/null
+++ b/modules/validation/validatable.go
@@ -0,0 +1,84 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// Copyright 2023 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package validation
+
+import (
+ "fmt"
+ "reflect"
+ "strings"
+ "unicode/utf8"
+
+ "code.gitea.io/gitea/modules/timeutil"
+)
+
+// ErrNotValid represents an validation error
+type ErrNotValid struct {
+ Message string
+}
+
+func (err ErrNotValid) Error() string {
+ return fmt.Sprintf("Validation Error: %v", err.Message)
+}
+
+// IsErrNotValid checks if an error is a ErrNotValid.
+func IsErrNotValid(err error) bool {
+ _, ok := err.(ErrNotValid)
+ return ok
+}
+
+type Validateable interface {
+ Validate() []string
+}
+
+func IsValid(v Validateable) (bool, error) {
+ if err := v.Validate(); len(err) > 0 {
+ typeof := reflect.TypeOf(v)
+ errString := strings.Join(err, "\n")
+ return false, ErrNotValid{fmt.Sprint(typeof, ": ", errString)}
+ }
+
+ return true, nil
+}
+
+func ValidateNotEmpty(value any, name string) []string {
+ isValid := true
+ switch v := value.(type) {
+ case string:
+ if v == "" {
+ isValid = false
+ }
+ case timeutil.TimeStamp:
+ if v.IsZero() {
+ isValid = false
+ }
+ case int64:
+ if v == 0 {
+ isValid = false
+ }
+ default:
+ isValid = false
+ }
+
+ if isValid {
+ return []string{}
+ }
+ return []string{fmt.Sprintf("%v should not be empty", name)}
+}
+
+func ValidateMaxLen(value string, maxLen int, name string) []string {
+ if utf8.RuneCountInString(value) > maxLen {
+ return []string{fmt.Sprintf("Value %v was longer than %v", name, maxLen)}
+ }
+ return []string{}
+}
+
+func ValidateOneOf(value any, allowed []any, name string) []string {
+ for _, allowedElem := range allowed {
+ if value == allowedElem {
+ return []string{}
+ }
+ }
+ return []string{fmt.Sprintf("Value %v is not contained in allowed values %v", value, allowed)}
+}