-
-
Notifications
You must be signed in to change notification settings - Fork 230
/
stdrwc.go
51 lines (44 loc) · 1.06 KB
/
stdrwc.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package lspcmd
import (
"errors"
"io"
"go.uber.org/zap"
)
// stdrwc (standard read/write closer) reads from stdin, and writes to stdout.
func newStdRwc(log *zap.Logger, name string, w io.Writer, r io.Reader) stdrwc {
return stdrwc{
log: log,
name: name,
w: w,
r: r,
}
}
type stdrwc struct {
log *zap.Logger
name string
w io.Writer
r io.Reader
}
func (s stdrwc) Read(p []byte) (int, error) {
return s.r.Read(p)
}
func (s stdrwc) Write(p []byte) (int, error) {
return s.w.Write(p)
}
func (s stdrwc) Close() error {
s.log.Info("rwc: closing", zap.String("name", s.name))
var errs []error
if closer, isCloser := s.r.(io.Closer); isCloser {
if err := closer.Close(); err != nil {
s.log.Error("rwc: error closing reader", zap.String("name", s.name), zap.Error(err))
errs = append(errs, err)
}
}
if closer, isCloser := s.w.(io.Closer); isCloser {
if err := closer.Close(); err != nil {
s.log.Error("rwc: error closing writer", zap.String("name", s.name), zap.Error(err))
errs = append(errs, err)
}
}
return errors.Join(errs...)
}