blob: 3e39f6aec11e4059834fe4f50d194f0273c15965 [file] [log] [blame]
/* Copyright 2018 Google Inc. All Rights Reserved. */
// Package datasource provides data source from local file, bytes etc.
package datasource
import (
"bytes"
"context"
"fmt"
"io"
"io/ioutil"
"os"
"google.golang.org/protobuf/proto"
)
// Source accesses data source.
type Source interface {
Open(context.Context) (io.ReadCloser, error)
String() string
}
type localFile struct {
fullpath string
}
// LocalFile creates new source for the local file.
func LocalFile(fullpath string) Source {
return localFile{
fullpath: fullpath,
}
}
func (f localFile) String() string {
return fmt.Sprintf("localfile:%s", f.fullpath)
}
func (f localFile) Open(context.Context) (io.ReadCloser, error) {
fp, err := os.Open(f.fullpath)
return fp, err
}
type byteData struct {
name string
data []byte
}
// Bytes create new source for bytes.
func Bytes(name string, b []byte) Source {
return byteData{
name: name,
data: b,
}
}
func (b byteData) String() string {
return b.name
}
func (b byteData) Open(context.Context) (io.ReadCloser, error) {
r := bytes.NewReader(b.data)
return ioutil.NopCloser(r), nil
}
// ReadAll reads all data from source.
func ReadAll(ctx context.Context, src Source) ([]byte, error) {
f, err := src.Open(ctx)
if err != nil {
return nil, err
}
defer f.Close()
return ioutil.ReadAll(f)
}
// ReadProto reads data as proto message.
func ReadProto(ctx context.Context, src Source, m proto.Message) error {
b, err := ReadAll(ctx, src)
if err != nil {
return err
}
return proto.Unmarshal(b, m)
}