Skip to content
This repository was archived by the owner on Aug 22, 2022. It is now read-only.

Commit 5e79594

Browse files
authored
Merge pull request #15 from markbates/marshal-mathers
do run run
2 parents 27560b9 + 86547c5 commit 5e79594

File tree

7 files changed

+139
-166
lines changed

7 files changed

+139
-166
lines changed

apply.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
// for layering of pkging.Pkger implementations.
1212
func Apply(pkg pkging.Pkger, err error) error {
1313
if err != nil {
14+
panic(err)
1415
return err
1516
}
1617
gil.Lock()

apply_debug.go

Lines changed: 0 additions & 26 deletions
This file was deleted.

pkging/embed/embed.go

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,63 @@ import (
44
"bytes"
55
"compress/gzip"
66
"encoding/hex"
7-
"encoding/json"
7+
"io"
88

99
"github.com/markbates/pkger/here"
10+
"github.com/markbates/pkger/internal/takeon/github.com/markbates/hepa"
11+
"github.com/markbates/pkger/internal/takeon/github.com/markbates/hepa/filters"
1012
)
1113

12-
type Embedder interface {
13-
MarshalEmbed() ([]byte, error)
14-
}
14+
func Decode(src []byte) ([]byte, error) {
15+
dst := make([]byte, hex.DecodedLen(len(src)))
16+
_, err := hex.Decode(dst, src)
17+
if err != nil {
18+
return nil, err
19+
}
1520

16-
type Unembedder interface {
17-
UnmarshalEmbed([]byte) error
18-
}
21+
r, err := gzip.NewReader(bytes.NewReader(dst))
22+
if err != nil {
23+
return nil, err
24+
}
1925

20-
type Data struct {
21-
Infos map[string]here.Info `json:"infos"`
22-
Files map[string]File `json:"files"`
23-
Here here.Info `json:"here"`
26+
bb := &bytes.Buffer{}
27+
if _, err := io.Copy(bb, r); err != nil {
28+
return nil, err
29+
}
30+
return bb.Bytes(), nil
2431
}
2532

26-
func (d *Data) MarshalEmbed() ([]byte, error) {
33+
func Encode(b []byte) ([]byte, error) {
2734
bb := &bytes.Buffer{}
2835
gz := gzip.NewWriter(bb)
29-
defer gz.Close()
30-
if err := json.NewEncoder(gz).Encode(d); err != nil {
36+
37+
if _, err := gz.Write(b); err != nil {
3138
return nil, err
3239
}
33-
if err := gz.Close(); err != nil {
40+
41+
if err := gz.Flush(); err != nil {
3442
return nil, err
3543
}
36-
s := hex.EncodeToString(bb.Bytes())
37-
return []byte(s), nil
38-
}
3944

40-
func (d *Data) UnmarshalEmbed(in []byte) error {
41-
b := make([]byte, len(in))
42-
if _, err := hex.Decode(b, in); err != nil {
43-
return err
45+
if err := gz.Close(); err != nil {
46+
return nil, err
4447
}
4548

46-
gz, err := gzip.NewReader(bytes.NewReader(b))
49+
hep := hepa.New()
50+
hep = hepa.With(hep, filters.Home())
51+
hep = hepa.With(hep, filters.Golang())
52+
53+
b, err := hep.Filter(bb.Bytes())
4754
if err != nil {
48-
return err
55+
return nil, err
4956
}
50-
defer gz.Close()
5157

52-
p := &Data{}
53-
if err := json.NewDecoder(gz).Decode(p); err != nil {
54-
return err
55-
}
56-
(*d) = *p
57-
return nil
58+
s := hex.EncodeToString(b)
59+
return []byte(s), nil
60+
}
61+
62+
type Data struct {
63+
Infos map[string]here.Info `json:"infos"`
64+
Files map[string]File `json:"files"`
65+
Here here.Info `json:"here"`
5866
}

pkging/embed/embed_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package embed
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
)
8+
9+
func Test_Encoding(t *testing.T) {
10+
r := require.New(t)
11+
12+
in := []byte("hi\n")
13+
14+
enc, err := Encode(in)
15+
r.NoError(err)
16+
17+
r.NotEqual(in, enc)
18+
19+
dec, err := Decode(enc)
20+
r.NoError(err)
21+
r.Equal(in, dec)
22+
}

pkging/mem/embed.go

Lines changed: 64 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,91 @@
11
package mem
22

33
import (
4-
"bytes"
5-
"compress/gzip"
6-
"encoding/hex"
74
"encoding/json"
5+
6+
"github.com/markbates/pkger/here"
7+
"github.com/markbates/pkger/internal/maps"
8+
"github.com/markbates/pkger/pkging"
9+
"github.com/markbates/pkger/pkging/embed"
810
)
911

10-
func (pkg *Pkger) MarshalEmbed() ([]byte, error) {
11-
bb := &bytes.Buffer{}
12-
gz := gzip.NewWriter(bb)
13-
defer gz.Close()
14-
if err := json.NewEncoder(gz).Encode(pkg); err != nil {
15-
return nil, err
16-
}
17-
if err := gz.Close(); err != nil {
18-
return nil, err
12+
// MarshalJSON creates a fully re-hydratable JSON representation of *Pkger
13+
func (p *Pkger) MarshalJSON() ([]byte, error) {
14+
files := map[string]embed.File{}
15+
16+
p.files.Range(func(key here.Path, file pkging.File) bool {
17+
f, ok := file.(*File)
18+
if !ok {
19+
return true
20+
}
21+
ef := embed.File{
22+
Info: f.info,
23+
Here: f.Here,
24+
Path: f.path,
25+
Parent: f.parent,
26+
Data: f.data,
27+
}
28+
files[key.String()] = ef
29+
return true
30+
})
31+
32+
infos := map[string]here.Info{}
33+
p.infos.Range(func(key string, info here.Info) bool {
34+
infos[key] = info
35+
return true
36+
})
37+
ed := embed.Data{
38+
Infos: infos,
39+
Files: files,
40+
Here: p.Here,
1941
}
20-
s := hex.EncodeToString(bb.Bytes())
21-
return []byte(s), nil
42+
return json.Marshal(ed)
2243
}
2344

24-
func (pkg *Pkger) UnmarshalEmbed(in []byte) error {
25-
b := make([]byte, len(in))
26-
if _, err := hex.Decode(b, in); err != nil {
27-
return err
45+
// UnmarshalJSON re-hydrates the *Pkger
46+
func (p *Pkger) UnmarshalJSON(b []byte) error {
47+
y := &embed.Data{
48+
Infos: map[string]here.Info{},
49+
Files: map[string]embed.File{},
2850
}
2951

30-
gz, err := gzip.NewReader(bytes.NewReader(b))
31-
if err != nil {
52+
if err := json.Unmarshal(b, &y); err != nil {
3253
return err
3354
}
34-
defer gz.Close()
3555

36-
p := &Pkger{}
37-
if err := json.NewDecoder(gz).Decode(p); err != nil {
38-
return err
56+
p.Here = y.Here
57+
p.infos = &maps.Infos{}
58+
for k, v := range y.Infos {
59+
p.infos.Store(k, v)
60+
}
61+
62+
p.files = &maps.Files{}
63+
for k, v := range y.Files {
64+
pt, err := p.Parse(k)
65+
if err != nil {
66+
return err
67+
}
68+
69+
f := &File{
70+
Here: v.Here,
71+
info: v.Info,
72+
path: v.Path,
73+
data: v.Data,
74+
parent: v.Parent,
75+
}
76+
p.files.Store(pt, f)
3977
}
40-
(*pkg) = *p
4178
return nil
4279
}
4380

4481
func UnmarshalEmbed(in []byte) (*Pkger, error) {
45-
b := make([]byte, len(in))
46-
if _, err := hex.Decode(b, in); err != nil {
47-
return nil, err
48-
}
49-
50-
gz, err := gzip.NewReader(bytes.NewReader(b))
82+
b, err := embed.Decode(in)
5183
if err != nil {
5284
return nil, err
5385
}
54-
defer gz.Close()
5586

5687
p := &Pkger{}
57-
if err := json.NewDecoder(gz).Decode(p); err != nil {
88+
if err := json.Unmarshal(b, p); err != nil {
5889
return nil, err
5990
}
6091
return p, nil

pkging/mem/mem.go

Lines changed: 0 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package mem
22

33
import (
4-
"encoding/json"
54
"fmt"
65
"os"
76
"path"
@@ -12,7 +11,6 @@ import (
1211
"github.com/markbates/pkger/here"
1312
"github.com/markbates/pkger/internal/maps"
1413
"github.com/markbates/pkger/pkging"
15-
"github.com/markbates/pkger/pkging/embed"
1614
)
1715

1816
var _ pkging.Pkger = &Pkger{}
@@ -34,75 +32,6 @@ type Pkger struct {
3432
files *maps.Files
3533
}
3634

37-
// MarshalJSON creates a fully re-hydratable JSON representation of *Pkger
38-
func (p *Pkger) MarshalJSON() ([]byte, error) {
39-
files := map[string]embed.File{}
40-
41-
p.files.Range(func(key here.Path, file pkging.File) bool {
42-
f, ok := file.(*File)
43-
if !ok {
44-
return true
45-
}
46-
ef := embed.File{
47-
Info: f.info,
48-
Here: f.Here,
49-
Path: f.path,
50-
Parent: f.parent,
51-
Data: f.data,
52-
}
53-
files[key.String()] = ef
54-
return true
55-
})
56-
57-
infos := map[string]here.Info{}
58-
p.infos.Range(func(key string, info here.Info) bool {
59-
infos[key] = info
60-
return true
61-
})
62-
ed := embed.Data{
63-
Infos: infos,
64-
Files: files,
65-
Here: p.Here,
66-
}
67-
return json.Marshal(ed)
68-
}
69-
70-
// UnmarshalJSON re-hydrates the *Pkger
71-
func (p *Pkger) UnmarshalJSON(b []byte) error {
72-
y := &embed.Data{
73-
Infos: map[string]here.Info{},
74-
Files: map[string]embed.File{},
75-
}
76-
77-
if err := json.Unmarshal(b, &y); err != nil {
78-
return err
79-
}
80-
81-
p.Here = y.Here
82-
p.infos = &maps.Infos{}
83-
for k, v := range y.Infos {
84-
p.infos.Store(k, v)
85-
}
86-
87-
p.files = &maps.Files{}
88-
for k, v := range y.Files {
89-
pt, err := p.Parse(k)
90-
if err != nil {
91-
return err
92-
}
93-
94-
f := &File{
95-
Here: v.Here,
96-
info: v.Info,
97-
path: v.Path,
98-
data: v.Data,
99-
parent: v.Parent,
100-
}
101-
p.files.Store(pt, f)
102-
}
103-
return nil
104-
}
105-
10635
// Abs returns an absolute representation of path. If the path is not absolute it will be joined with the current working directory to turn it into an absolute path. The absolute path name for a given file is not guaranteed to be unique. Abs calls Clean on the result.
10736
func (f *Pkger) Abs(p string) (string, error) {
10837
pt, err := f.Parse(p)

0 commit comments

Comments
 (0)