Skip to content

Commit f20ed70

Browse files
once/closer: refactor api (#338)
1 parent 418f98d commit f20ed70

4 files changed

Lines changed: 27 additions & 30 deletions

File tree

internal/once/closer.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
package once
22

3-
import "github.com/livebud/bud/internal/errs"
3+
import (
4+
"github.com/livebud/bud/internal/errs"
5+
)
46

57
type Closer struct {
6-
Closes []func() error
8+
closes []func() error
79
once Error
810
}
911

10-
func (c *Closer) Close(reasons ...error) error {
12+
func (c *Closer) Add(fn func() error) {
13+
c.closes = append(c.closes, fn)
14+
}
15+
16+
func (c *Closer) Close() (err error) {
1117
return c.once.Do(func() error {
12-
err := errs.Join(reasons...)
13-
for i := len(c.Closes) - 1; i >= 0; i-- {
14-
err = errs.Join(err, c.Closes[i]())
18+
for i := len(c.closes) - 1; i >= 0; i-- {
19+
err = errs.Join(err, c.closes[i]())
1520
}
1621
return err
1722
})

internal/once/closer_test.go

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,21 @@ func TestCloserOk(t *testing.T) {
1313
var closer once.Closer
1414
a := func() error { return nil }
1515
b := func() error { return nil }
16-
closer.Closes = append(closer.Closes, a)
17-
closer.Closes = append(closer.Closes, b)
16+
closer.Add(a)
17+
closer.Add(b)
1818
err := closer.Close()
1919
is.NoErr(err)
2020
}
2121

22-
func TestCloserReason(t *testing.T) {
23-
is := is.New(t)
24-
e := errors.New("error")
25-
var closer once.Closer
26-
a := func() error { return nil }
27-
b := func() error { return nil }
28-
closer.Closes = append(closer.Closes, a)
29-
closer.Closes = append(closer.Closes, b)
30-
err := closer.Close(e)
31-
is.True(errors.Is(err, e))
32-
}
33-
3422
func TestCloserErrors(t *testing.T) {
3523
is := is.New(t)
3624
e1 := errors.New("error 1")
3725
e2 := errors.New("error 2")
3826
var closer once.Closer
3927
a := func() error { return e1 }
4028
b := func() error { return e2 }
41-
closer.Closes = append(closer.Closes, a)
42-
closer.Closes = append(closer.Closes, b)
29+
closer.Add(a)
30+
closer.Add(b)
4331
err := closer.Close()
4432
is.True(err != nil)
4533
is.Equal(err.Error(), "error 2. error 1")

package/budfs/budfs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ func (f *fileSystem) Context() context.Context {
438438
// Defer a function until close is called. May be called multiple times if
439439
// generators are triggered multiple times.
440440
func (f *fileSystem) Defer(fn func() error) {
441-
f.fsys.closer.Closes = append(f.fsys.closer.Closes, fn)
441+
f.fsys.closer.Add(fn)
442442
}
443443

444444
// Glob implements fs.GlobFS

package/remotefs/command.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"io/fs"
66

7+
"github.com/livebud/bud/internal/errs"
78
"github.com/livebud/bud/internal/exe"
89
"github.com/livebud/bud/internal/extrafile"
910
"github.com/livebud/bud/internal/once"
@@ -24,28 +25,31 @@ func (c *Command) Start(ctx context.Context, name string, args ...string) (*Proc
2425
if err != nil {
2526
return nil, err
2627
}
27-
closer.Closes = append(closer.Closes, ln.Close)
28+
closer.Add(ln.Close)
2829
// Turn the listener into a file to be passed to the subprocess
2930
file, err := ln.File()
3031
if err != nil {
31-
return nil, closer.Close(err)
32+
err = errs.Join(err, closer.Close())
33+
return nil, err
3234
}
33-
closer.Closes = append(closer.Closes, file.Close)
35+
closer.Add(file.Close)
3436
// Inject the file listener into the subprocess
3537
extrafile.Inject(&c.ExtraFiles, &c.Env, defaultPrefix, file)
3638
// Start the subprocess
3739
process, err := (*exe.Command)(c).Start(ctx, name, args...)
3840
if err != nil {
39-
return nil, closer.Close(err)
41+
err = errs.Join(err, closer.Close())
42+
return nil, err
4043
}
41-
closer.Closes = append(closer.Closes, process.Close)
44+
closer.Add(process.Close)
4245
// Dial the subprocess and return a client
4346
addr := ln.Addr().String()
4447
client, err := Dial(ctx, addr)
4548
if err != nil {
46-
return nil, closer.Close(err)
49+
err = errs.Join(err, closer.Close())
50+
return nil, err
4751
}
48-
closer.Closes = append(closer.Closes, client.Close)
52+
closer.Add(client.Close)
4953
// Return the process
5054
return &Process{client, &closer, process, addr}, nil
5155
}

0 commit comments

Comments
 (0)