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  }