errs.go
func Wrap(wrapErr error, info Info, publicMsg ...interface{}) Err {
	if wrapErr == nil {
		return nil
	}
	if info == nil {
		info = Info{}
	}
	if errsErr, isErr := IsErr(wrapErr); isErr {
		if errStructErr, isErrsErr := errsErr.(*err); isErrsErr {
			errStructErr.mergeIn(info, publicMsg)
			return errStructErr
		}
		return errsErr
	}
	return newErr(debug.Stack(), wrapErr, false, info, publicMsg)
}
func Wrap(wrapErr error, info Info, publicMsg ...interface{}) Err {
	if wrapErr == nil {
		return nil
	}
	if info == nil {
		info = Info{}
	}
	if errsErr, isErr := IsErr(wrapErr); isErr {
		if errStructErr, isErrsErr := errsErr.(*err); isErrsErr {
			errStructErr.mergeIn(info, publicMsg)
			return errStructErr
		}
		return errsErr
	}
	return newErr(debug.Stack(), wrapErr, false, info, publicMsg)
}
// Wrap the given error in an errs.Err. If err is nil, Wrap returns nil.
// Use Err.WrappedError for direct access to the wrapped error.