github.com/falafeljan/pkger@v0.18.0/pkging/mem/embed.go (about) 1 package mem 2 3 import ( 4 "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" 10 ) 11 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, 41 } 42 return json.Marshal(ed) 43 } 44 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{}, 50 } 51 52 if err := json.Unmarshal(b, &y); err != nil { 53 return err 54 } 55 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) 77 } 78 return nil 79 } 80 81 func UnmarshalEmbed(in []byte) (*Pkger, error) { 82 b, err := embed.Decode(in) 83 if err != nil { 84 return nil, err 85 } 86 87 p := &Pkger{} 88 if err := json.Unmarshal(b, p); err != nil { 89 return nil, err 90 } 91 return p, nil 92 }