structvalidation.go (1802B)
1 // GoToSocial 2 // Copyright (C) GoToSocial Authors admin@gotosocial.org 3 // SPDX-License-Identifier: AGPL-3.0-or-later 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package validate 19 20 import ( 21 "reflect" 22 23 "github.com/go-playground/validator/v10" 24 "github.com/superseriousbusiness/gotosocial/internal/regexes" 25 ) 26 27 var v *validator.Validate 28 29 func ulidValidator(fl validator.FieldLevel) bool { 30 field := fl.Field() 31 32 switch field.Kind() { 33 case reflect.String: 34 return regexes.ULID.MatchString(field.String()) 35 default: 36 return false 37 } 38 } 39 40 func init() { 41 v = validator.New() 42 if err := v.RegisterValidation("ulid", ulidValidator); err != nil { 43 panic(err) 44 } 45 } 46 47 // Struct validates the passed struct, returning validator.ValidationErrors if invalid, or nil if OK. 48 func Struct(s interface{}) error { 49 return processValidationError(v.Struct(s)) 50 } 51 52 func processValidationError(err error) error { 53 if err == nil { 54 return nil 55 } 56 57 if ive, ok := err.(*validator.InvalidValidationError); ok { 58 panic(ive) 59 } 60 61 valErr, ok := err.(validator.ValidationErrors) 62 if !ok { 63 panic("*validator.InvalidValidationError could not be coerced to validator.ValidationErrors") 64 } 65 66 return valErr 67 }