mirror of
https://github.com/tailscale/tailscale.git
synced 2024-12-01 14:05:39 +00:00
01185e436f
This adds a new generic result type (motivated by golang/go#70084) to try it out, and uses it in the new lineutil package (replacing the old lineread package), changing that package to return iterators: sometimes over []byte (when the input is all in memory), but sometimes iterators over results of []byte, if errors might happen at runtime. Updates #12912 Updates golang/go#70084 Change-Id: Iacdc1070e661b5fb163907b1e8b07ac7d51d3f83 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
50 lines
1.2 KiB
Go
50 lines
1.2 KiB
Go
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
// Package result contains the Of result type, which is
|
|
// either a value or an error.
|
|
package result
|
|
|
|
// Of is either a T value or an error.
|
|
//
|
|
// Think of it like Rust or Swift's result types.
|
|
// It's named "Of" because the fully qualified name
|
|
// for callers reads result.Of[T].
|
|
type Of[T any] struct {
|
|
v T // valid if Err is nil; invalid if Err is non-nil
|
|
err error
|
|
}
|
|
|
|
// Value returns a new result with value v,
|
|
// without an error.
|
|
func Value[T any](v T) Of[T] {
|
|
return Of[T]{v: v}
|
|
}
|
|
|
|
// Error returns a new result with error err.
|
|
// If err is nil, the returned result is equivalent
|
|
// to calling Value with T's zero value.
|
|
func Error[T any](err error) Of[T] {
|
|
return Of[T]{err: err}
|
|
}
|
|
|
|
// MustValue returns r's result value.
|
|
// It panics if r.Err returns non-nil.
|
|
func (r Of[T]) MustValue() T {
|
|
if r.err != nil {
|
|
panic(r.err)
|
|
}
|
|
return r.v
|
|
}
|
|
|
|
// Value returns r's result value and error.
|
|
func (r Of[T]) Value() (T, error) {
|
|
return r.v, r.err
|
|
}
|
|
|
|
// Err returns r's error, if any.
|
|
// When r.Err returns nil, it's safe to call r.MustValue without it panicking.
|
|
func (r Of[T]) Err() error {
|
|
return r.err
|
|
}
|