package diag

import 

// MultiError pack multiple errors into one error.
type MultiError struct {
	Errors []error
}

func ( MultiError) () string {
	switch len(.Errors) {
	case 0:
		return "no error"
	case 1:
		return .Errors[0].Error()
	default:
		var  bytes.Buffer
		.WriteString("multiple errors: ")
		for ,  := range .Errors {
			if  > 0 {
				.WriteString("; ")
			}
			.WriteString(.Error())
		}
		return .String()
	}
}

// Errors concatenate multiple errors into one. If all errors are nil, it
// returns nil. If there is one non-nil error, it is returned. Otherwise the
// return value is a MultiError containing all the non-nil arguments. Arguments
// of the type MultiError are flattened.
func ( ...error) error {
	var  []error
	for ,  := range  {
		if  != nil {
			if ,  := .(MultiError);  {
				 = append(, .Errors...)
			} else {
				 = append(, )
			}
		}
	}
	switch len() {
	case 0:
		return nil
	case 1:
		return [0]
	default:
		return MultiError{}
	}
}