aboutsummaryrefslogtreecommitdiff
path: root/file/file.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-23 00:53:01 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-23 00:53:01 +0200
commit517383f806898378c4840657521cc60eb969e9d3 (patch)
tree435385342c6cefc9823fd96c073cb95dfcea0451 /file/file.go
parent25e9c9f19f90aea367ae9831df1e7208e3f5f0b5 (diff)
bikeshadding
Diffstat (limited to 'file/file.go')
-rw-r--r--file/file.go81
1 files changed, 34 insertions, 47 deletions
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
}