github.com/sandwich-go/boost@v1.3.29/xerror/array.go (about)

     1  package xerror
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  // ErrorFormatFunc 格式化 error 数组
     9  // 调用 Error 时,会将  error 数组进行格式化,默认 ListFormatFunc
    10  // 可以通过 SetFormatFunc 函数进行设置
    11  type ErrorFormatFunc func([]error) string
    12  
    13  // Array 错误数组,可以将多个 error 进行组装,并当成 error 进行函数传递或返回
    14  type Array struct {
    15  	errors     []error
    16  	formatFunc ErrorFormatFunc
    17  }
    18  
    19  // Error 实现 error 接口
    20  func (e Array) Error() string {
    21  	fn := e.formatFunc
    22  	if fn == nil {
    23  		fn = ListFormatFunc
    24  	}
    25  	return fn(e.errors)
    26  }
    27  
    28  // Push 推入一个错误信息,err如果为nil则丢弃
    29  func (e *Array) Push(err error) {
    30  	if err == nil {
    31  		return
    32  	}
    33  	e.errors = append(e.errors, err)
    34  }
    35  
    36  // LastErr 返回最后一个错误信息,如果没有错误则返回nil
    37  func (e *Array) LastErr() error {
    38  	if e == nil || len(e.errors) == 0 {
    39  		return nil
    40  	}
    41  	return e.errors[len(e.errors)-1]
    42  }
    43  
    44  // Err 返回标准error对象,如果错误列表为空则返回nil
    45  func (e *Array) Err() error {
    46  	if e == nil || len(e.errors) == 0 {
    47  		return nil
    48  	}
    49  	return e
    50  }
    51  
    52  // String
    53  func (e *Array) String() string { return fmt.Sprintf("*%#v", *e) }
    54  
    55  // WrappedErrors 返回内部所有的 error
    56  func (e *Array) WrappedErrors() []error { return e.errors }
    57  
    58  // SetFormatFunc 设置格式化 error 数组函数,默认 ListFormatFunc
    59  func (e *Array) SetFormatFunc(f ErrorFormatFunc) { e.formatFunc = f }
    60  
    61  // DotFormatFunc 多个 error,通过 ',' 进行分割输出
    62  // 如输出: error 1,error 2
    63  var DotFormatFunc = func(es []error) string {
    64  	var errStr = make([]string, 0)
    65  	for i := 0; i < len(es); i++ {
    66  		errStr = append(errStr, es[i].Error())
    67  	}
    68  	return strings.Join(errStr, ",")
    69  }
    70  
    71  // ListFormatFunc 多个 error,列表输出
    72  // 如输出: 2 errors occurred:
    73  //		 #1: error 1
    74  //		 #2: error 2
    75  var ListFormatFunc = func(es []error) string {
    76  	points := make([]string, len(es))
    77  	for i, err := range es {
    78  		points[i] = fmt.Sprintf("#%d: %s", i+1, err)
    79  	}
    80  	return fmt.Sprintf(
    81  		"%d errors occurred:\n%s",
    82  		len(es), strings.Join(points, "\n"))
    83  }