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")