-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
types/result, util/lineread: add package for a result type, use it
This adds a new generic result type (motivated by golang/go#70084) to try it out, and uses it in the 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>
- Loading branch information
Showing
14 changed files
with
173 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
// 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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
package lineread | ||
|
||
import ( | ||
"slices" | ||
"strings" | ||
"testing" | ||
) | ||
|
||
func TestBytesLines(t *testing.T) { | ||
var got []string | ||
for line := range Bytes([]byte("foo\n\nbar\nbaz")) { | ||
got = append(got, string(line)) | ||
} | ||
want := []string{"foo", "", "bar", "baz"} | ||
if !slices.Equal(got, want) { | ||
t.Errorf("got %q; want %q", got, want) | ||
} | ||
} | ||
|
||
func TestReader(t *testing.T) { | ||
var got []string | ||
Reader(strings.NewReader("foo\n\nbar\nbaz"), func(line []byte) error { | ||
got = append(got, string(line)) | ||
return nil | ||
}) | ||
want := []string{"foo", "", "bar", "baz"} | ||
if !slices.Equal(got, want) { | ||
t.Errorf("got %q; want %q", got, want) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters