Fix some tests.
[lightning.git] / gob.go
diff --git a/gob.go b/gob.go
index d7ac24e48fbcdd5aa26c8bed50dc3e6148ccf79e..70a5d2811a7e94bf9646863ff0283d271f8beb5b 100644 (file)
--- a/gob.go
+++ b/gob.go
@@ -1,39 +1,78 @@
-package main
+// Copyright (C) The Lightning Authors. All rights reserved.
+//
+// SPDX-License-Identifier: AGPL-3.0
+
+package lightning
 
 import (
+       "bufio"
        "encoding/gob"
        "io"
+       "io/ioutil"
        _ "net/http/pprof"
 
+       "github.com/klauspost/pgzip"
        "golang.org/x/crypto/blake2b"
 )
 
 type CompactGenome struct {
        Name     string
        Variants []tileVariantID
+       StartTag tagID
+       EndTag   tagID
+}
+
+type CompactSequence struct {
+       Name          string
+       TileSequences map[string][]tileLibRef
+}
+
+type TileVariant struct {
+       Tag      tagID
+       Ref      bool
+       Variant  tileVariantID
+       Blake2b  [blake2b.Size256]byte
+       Sequence []byte
 }
 
 type LibraryEntry struct {
-       TagSet         [][]byte
-       CompactGenomes []CompactGenome
-       TileVariants   []struct {
-               Tag      tagID
-               Blake2b  [blake2b.Size]byte
-               Sequence []byte
-       }
+       TagSet           [][]byte
+       CompactGenomes   []CompactGenome
+       CompactSequences []CompactSequence
+       TileVariants     []TileVariant
 }
 
-func ReadCompactGenomes(rdr io.Reader) ([]CompactGenome, error) {
-       dec := gob.NewDecoder(rdr)
+func ReadCompactGenomes(rdr io.Reader, gz bool) ([]CompactGenome, error) {
        var ret []CompactGenome
+       err := DecodeLibrary(rdr, gz, func(ent *LibraryEntry) error {
+               ret = append(ret, ent.CompactGenomes...)
+               return nil
+       })
+       return ret, err
+}
+
+func DecodeLibrary(rdr io.Reader, gz bool, cb func(*LibraryEntry) error) error {
+       zrdr := ioutil.NopCloser(rdr)
+       var err error
+       if gz {
+               zrdr, err = pgzip.NewReader(bufio.NewReaderSize(rdr, 1<<20))
+               if err != nil {
+                       return err
+               }
+               defer zrdr.Close()
+       }
+       dec := gob.NewDecoder(zrdr)
        for {
                var ent LibraryEntry
-               err := dec.Decode(&ent)
+               err = dec.Decode(&ent)
                if err == io.EOF {
-                       return ret, nil
+                       return zrdr.Close()
                } else if err != nil {
-                       return nil, err
+                       return err
+               }
+               err = cb(&ent)
+               if err != nil {
+                       return err
                }
-               ret = append(ret, ent.CompactGenomes...)
        }
 }