github.com/mailru/activerecord@v1.12.2/internal/pkg/arerror/arerror.go (about) 1 package arerror 2 3 import ( 4 "errors" 5 "fmt" 6 "reflect" 7 "strings" 8 ) 9 10 // Базовая функция для обработки отображения ошибки 11 // Ошибки могуть быть бесконечно вложены друг в друга, 12 // каждая новая вложенная ошибка распечатывается с новой строки 13 // Сама ошибка это структура с любым набором полей, 14 // поле Err содержит вложенную ошибку 15 func ErrorBase(errStruct interface{}) string { 16 reflV := reflect.ValueOf(errStruct).Elem() 17 reflT := reflV.Type() 18 reflT.Kind() 19 fmtO := []string{} 20 param := []interface{}{} 21 for i := 0; i < reflV.NumField(); i++ { 22 fieldT := reflT.Field(i) 23 fieldV := reflV.Field(i) 24 form, ok := fieldT.Tag.Lookup("format") 25 if !ok { 26 form = "%s" 27 } 28 if fieldT.Name == "Err" { 29 fmtO = append(fmtO, "\n\t"+form) 30 } else { 31 fmtO = append(fmtO, fieldT.Name+": `"+form+"`") 32 } 33 param = append(param, fieldV.Interface()) 34 } 35 return fmt.Sprintf(reflT.Name()+" "+strings.Join(fmtO, "; "), param...) 36 } 37 38 var ErrBadPkgName = errors.New("bad package name. See https://go.dev/blog/package-names")