From 517383f806898378c4840657521cc60eb969e9d3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 23 Jul 2017 00:53:01 +0200 Subject: bikeshadding --- file/file.go | 81 +++++++++++++++++++++++++----------------------------------- 1 file changed, 34 insertions(+), 47 deletions(-) (limited to 'file/file.go') diff --git a/file/file.go b/file/file.go index 156f5b0..d69a640 100644 --- a/file/file.go +++ b/file/file.go @@ -2,6 +2,7 @@ package file import ( + "bufio" "bytes" "encoding" "encoding/base64" @@ -34,38 +35,16 @@ type Block struct { Message []byte // TODO replace with io.ReadCloser } -func Encode(w io.Writer, b *Block) error { - fmt.Fprintln(w, untrusted, b.Comment) - fmt.Fprintln(w, base64.StdEncoding.EncodeToString(b.Bytes)) - w.Write(b.Message) - return nil -} - -func EncodeToMemory(b *Block) []byte { - buf := new(bytes.Buffer) - Encode(buf, b) - return buf.Bytes() -} - -func EncodeFile(fname string, perm os.FileMode, b *Block) error { - fd, err := os.OpenFile(fname, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) - if err != nil { - return err - } - defer fd.Close() - return Encode(fd, b) -} - -func Decode(data []byte) (*Block, error) { - r := bytes.NewBuffer(data) - comment, err := r.ReadString('\n') +func decodeBlock(r io.Reader) (*Block, error) { + buf := bufio.NewReader(r) + comment, err := buf.ReadString('\n') if err != nil { return nil, err } if !strings.HasPrefix(comment, untrusted) { return nil, ErrComment } - raw, err := r.ReadString('\n') + raw, err := buf.ReadString('\n') if err != nil { return nil, err } @@ -73,7 +52,7 @@ func Decode(data []byte) (*Block, error) { if err != nil { return nil, err } - message, err := ioutil.ReadAll(r) + message, err := ioutil.ReadAll(buf) if err != nil { return nil, err } @@ -84,39 +63,43 @@ func Decode(data []byte) (*Block, error) { }, nil } -func DecodeFile(fname string) (*Block, error) { - body, err := ioutil.ReadFile(fname) - if err != nil { - return nil, err - } - return Decode(body) -} - -func ParseFile(fname string, u encoding.BinaryUnmarshaler) (string, io.Reader, error) { - body, err := ioutil.ReadFile(fname) +func DecodeFile(fname string, u encoding.BinaryUnmarshaler) (string, []byte, error) { + fd, err := os.Open(fname) if err != nil { return "", nil, err } - return Parse(body, u) + defer fd.Close() + return Decode(fd, u) } -// TODO rename -func Parse(data []byte, u encoding.BinaryUnmarshaler) (string, io.Reader, error) { - block, err := Decode(data) +func Decode(r io.Reader, u encoding.BinaryUnmarshaler) (string, []byte, error) { + block, err := decodeBlock(r) if err != nil { return "", nil, err } if err := u.UnmarshalBinary(block.Bytes); err != nil { return "", nil, err } - if len(block.Message) > 0 { - return block.Comment, bytes.NewReader(block.Message), nil + return block.Comment, block.Message, nil +} + +func encodeBlock(w io.Writer, b *Block) error { + fmt.Fprintln(w, untrusted, b.Comment) + fmt.Fprintln(w, base64.StdEncoding.EncodeToString(b.Bytes)) + w.Write(b.Message) + return nil +} + +func EncodeFile(fname string, perm os.FileMode, b *Block) error { + fd, err := os.OpenFile(fname, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm) + if err != nil { + return err } - return block.Comment, nil, nil + defer fd.Close() + return encodeBlock(fd, b) } -// TODO rename -func Store(comment string, u encoding.BinaryMarshaler, r io.Reader) ([]byte, error) { +func Encode(comment string, u encoding.BinaryMarshaler, r io.Reader) ([]byte, error) { raw, err := u.MarshalBinary() if err != nil { return nil, err @@ -130,5 +113,9 @@ func Store(comment string, u encoding.BinaryMarshaler, r io.Reader) ([]byte, err Bytes: raw, Message: body, } - return EncodeToMemory(block), nil + buf := new(bytes.Buffer) + if err := encodeBlock(buf, block); err != nil { + return nil, err + } + return buf.Bytes(), nil } -- cgit v1.2.3