From b1b78c711ebd86ae06ffcf1e5508ca78a848037b Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sun, 16 Apr 2017 00:18:53 +0200 Subject: Refactor file handler --- file.go | 56 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 19 deletions(-) (limited to 'file.go') diff --git a/file.go b/file.go index e8218d8..0497c09 100644 --- a/file.go +++ b/file.go @@ -36,45 +36,58 @@ func checkComment(comment string) error { return nil } -func Parse(r io.Reader) (File, error) { +func (f *File) ReadFrom(r io.Reader) error { buf := bufio.NewReader(r) comment, err := buf.ReadString('\n') if err != nil { - return File{}, err + return err } if err := checkComment(comment); err != nil { - return File{}, err + return err } - comment = comment[len(commentHdr):] + f.Comment = strings.TrimSpace(comment[len(commentHdr):]) b64, err := buf.ReadBytes('\n') if err != nil { - return File{}, err + return err } + f.B64 = bytes.TrimSpace(b64) - body, err := ioutil.ReadAll(buf) + f.Body, err = ioutil.ReadAll(buf) if err != nil { - return File{}, err + return err } - return File{ - Comment: strings.TrimSpace(comment), - B64: bytes.TrimSpace(b64), - Body: body, - }, nil + return nil +} + +func Parse(b []byte) (*File, error) { + r := bytes.NewReader(b) + f := new(File) + return f, f.ReadFrom(r) } -func ParseFile(fname string) (File, error) { +func ParseFile(fname string) (*File, error) { fd, err := os.Open(fname) if err != nil { - return File{}, err + return nil, err } defer fd.Close() - return Parse(fd) + f := new(File) + return f, f.ReadFrom(fd) } -func (f File) Encode(w io.Writer) error { +func (f File) Bytes() ([]byte, error) { + buf := new(bytes.Buffer) + err := f.WriteTo(buf) + if err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func (f File) WriteTo(w io.Writer) error { fmt.Fprintf(w, "%v%v\n", commentHdr, f.Comment) fmt.Fprintf(w, "%v\n", string(f.B64)) if f.Body != nil { @@ -83,11 +96,16 @@ func (f File) Encode(w io.Writer) error { return nil } -func (f File) EncodeFile(fname string) error { - fd, err := os.Create(fname) +const ( + SecMode os.FileMode = 0600 + PubMode os.FileMode = 0644 +) + +func (f File) WriteFile(fname string, perm os.FileMode) error { + fd, err := os.OpenFile(fname, os.O_WRONLY|os.O_CREATE, perm) if err != nil { return err } defer fd.Close() - return f.Encode(fd) + return f.WriteTo(fd) } -- cgit v1.2.3