// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause

// Package vizerror provides types and utility funcs for handling visible errors
// that are safe to display to end users.
package vizerror

import (
	"errors"
	"fmt"
)

// Error is an error that is safe to display to end users.
type Error struct {
	err error
}

// Error implements the error interface.
func (e Error) Error() string {
	return e.err.Error()
}

// New returns an error that formats as the given text. It always returns a vizerror.Error.
func New(text string) error {
	return Error{errors.New(text)}
}

// Errorf returns an Error with the specified format and values. It always returns a vizerror.Error.
func Errorf(format string, a ...any) error {
	return Error{fmt.Errorf(format, a...)}
}

// Unwrap returns the underlying error.
func (e Error) Unwrap() error {
	return e.err
}

// Wrap wraps err with a vizerror.Error.
func Wrap(err error) error {
	if err == nil {
		return nil
	}
	return Error{err}
}

// As returns the first vizerror.Error in err's chain.
func As(err error) (e Error, ok bool) {
	ok = errors.As(err, &e)
	return
}