forked from oren12321/gogrpcft
/
streamer.go
63 lines (51 loc) · 1.32 KB
/
streamer.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
52
53
54
55
56
57
58
59
60
61
62
package file
import (
"os"
"io"
"fmt"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/types/known/emptypb"
pb "github.com/Pixellot/gogrpcft/v3/interface/file/proto"
)
type FileStreamer struct {
f *os.File
empty bool
buf []byte
path string
}
func (fs *FileStreamer) Init(msg proto.Message) error {
info, ok := msg.(*pb.File)
if !ok {
return fmt.Errorf("failed to convert 'Message' type to 'File' type")
}
fs.path = info.Path
fs.buf = make([]byte, 2048)
var err error
fs.f, err = os.Open(fs.path)
if err != nil {
return fmt.Errorf("failed to open '%s': %v", fs.path, err)
}
return nil
}
func (fs *FileStreamer) HasNext() bool {
return !fs.empty
}
func (fs *FileStreamer) GetNext() ([]byte, proto.Message, error) {
n, err := fs.f.Read(fs.buf)
if err == io.EOF {
fs.empty = true
return nil, &emptypb.Empty{}, nil
}
if err != nil {
return nil, &emptypb.Empty{}, fmt.Errorf("failed to read data from '%s': %v", fs.path, err)
}
return fs.buf[:n], &emptypb.Empty{}, nil
}
func (fs *FileStreamer) Finalize() error {
if fs.f != nil {
if err := fs.f.Close(); err != nil {
return fmt.Errorf("failed to close '%s': %v", fs.path, err)
}
}
return nil
}