package result

// Result is a small wrapper type encapsulating Value/Error tuples, mostly for
// use when sending values across channels
// NOTE: Avoid adding any functionality to this, any "nice" things added here will
// make it more difficult to switch to a more standardised Result-like type when
// one gets into the stdlib, or when we will want to switch to a library providing
// those types.
type Result[T any] struct {
	Value T
	Error error
}

func Ok[T any](value T) Result[T] {
	return Result[T]{
		Value: value,
	}
}

func Err[T any](err error) Result[T] {
	return Result[T]{
		Error: err,
	}
}

func Wrap[T any](value T, err error) Result[T] {
	return Result[T]{
		Value: value,
		Error: err,
	}
}

func (r Result[T]) Unwrap() (T, error) {
	return r.Value, r.Error
}

func (r Result[T]) Assert(noErrFn func(err error, msgAndArgs ...interface{})) T {
	noErrFn(r.Error)

	return r.Value
}