aboutsummaryrefslogtreecommitdiff
path: root/zhead
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2017-07-09 23:08:36 +0200
committerDimitri Sokolyuk <demon@dim13.org>2017-07-09 23:08:36 +0200
commita84719762a6073ccaba8ed547da065faacea433d (patch)
tree9c05aeba0ed247e05e347763bfd78e763b610797 /zhead
parentd52375efeefe85d4d241f3fec5a3f7c37c36e331 (diff)
Parse
Diffstat (limited to 'zhead')
-rw-r--r--zhead/header.go42
-rw-r--r--zhead/header_test.go14
2 files changed, 56 insertions, 0 deletions
diff --git a/zhead/header.go b/zhead/header.go
index 400be5b..2984345 100644
--- a/zhead/header.go
+++ b/zhead/header.go
@@ -1,7 +1,12 @@
package zhead
import (
+ "bufio"
"bytes"
+ "encoding/hex"
+ "io"
+ "strconv"
+ "strings"
"text/template"
"time"
)
@@ -37,3 +42,40 @@ func (h Header) Print() ([]byte, error) {
err = t.ExecuteTemplate(buf, "header", h)
return buf.Bytes(), err
}
+
+func Parse(r io.Reader) (Header, error) {
+ var inSum bool
+ var h Header
+ scanner := bufio.NewScanner(r)
+ for scanner.Scan() {
+ line := scanner.Text()
+ switch {
+ case strings.HasPrefix(line, "date="):
+ t, err := time.Parse(time.RFC3339, line[5:])
+ if err != nil {
+ return Header{}, err
+ }
+ h.Date = t
+ case strings.HasPrefix(line, "key="):
+ h.KeyFile = line[4:]
+ case strings.HasPrefix(line, "algorithm="):
+ h.Alg = line[10:]
+ case strings.HasPrefix(line, "blocksize="):
+ i, err := strconv.Atoi(line[9:])
+ if err != nil {
+ return Header{}, err
+ }
+ h.BlockSize = i
+ case line == "":
+ inSum = true
+ }
+ if inSum {
+ sum, err := hex.DecodeString(line)
+ if err != nil {
+ return Header{}, err
+ }
+ h.Sums = append(h.Sums, sum)
+ }
+ }
+ return h, scanner.Err()
+}
diff --git a/zhead/header_test.go b/zhead/header_test.go
index b6f8d35..820763a 100644
--- a/zhead/header_test.go
+++ b/zhead/header_test.go
@@ -1,6 +1,7 @@
package zhead
import (
+ "os"
"testing"
"time"
)
@@ -22,3 +23,16 @@ func TestHeader(t *testing.T) {
}
t.Log(string(body))
}
+
+func TestParse(t *testing.T) {
+ fd, err := os.Open("testdata/header.txt")
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer fd.Close()
+ h, err := Parse(fd)
+ if err != nil {
+ t.Fatal(err)
+ }
+ t.Log(h)
+}