github.com/falafeljan/pkger@v0.18.0/pkging/mem/add.go (about)

     1  package mem
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"os"
     7  	"path/filepath"
     8  
     9  	"github.com/markbates/pkger/here"
    10  	"github.com/markbates/pkger/pkging"
    11  )
    12  
    13  var _ pkging.Adder = &Pkger{}
    14  
    15  // Add copies the pkging.File into the *Pkger
    16  func (fx *Pkger) Add(files ...*os.File) error {
    17  	for _, f := range files {
    18  		info, err := f.Stat()
    19  		if err != nil {
    20  			return err
    21  		}
    22  		pt, err := fx.Parse(f.Name())
    23  		if err != nil {
    24  			return err
    25  		}
    26  
    27  		dir := f.Name()
    28  		if !info.IsDir() {
    29  			dir = filepath.Dir(dir)
    30  		}
    31  
    32  		her, err := here.Dir(dir)
    33  		if err != nil {
    34  			return err
    35  		}
    36  		if info.IsDir() {
    37  			err = filepath.Walk(f.Name(), func(path string, info os.FileInfo, err error) error {
    38  				if err != nil {
    39  					return err
    40  				}
    41  
    42  				f, err := os.Open(path)
    43  				if err != nil {
    44  					return err
    45  				}
    46  				defer f.Close()
    47  
    48  				pt, err := fx.Parse(path)
    49  				if err != nil {
    50  					return err
    51  				}
    52  
    53  				her, err := here.Package(pt.Pkg)
    54  				if err != nil {
    55  					return err
    56  				}
    57  
    58  				mf := &File{
    59  					Here:   her,
    60  					info:   pkging.NewFileInfo(info),
    61  					path:   pt,
    62  					pkging: fx,
    63  				}
    64  
    65  				if !info.IsDir() {
    66  					bb := &bytes.Buffer{}
    67  					_, err = io.Copy(bb, f)
    68  					if err != nil {
    69  						return err
    70  					}
    71  					mf.data = bb.Bytes()
    72  				}
    73  
    74  				fx.files.Store(mf.Path(), mf)
    75  
    76  				return nil
    77  			})
    78  			if err != nil {
    79  				return err
    80  			}
    81  			continue
    82  		}
    83  
    84  		mf := &File{
    85  			Here:   her,
    86  			info:   pkging.NewFileInfo(info),
    87  			path:   pt,
    88  			pkging: fx,
    89  		}
    90  
    91  		if !info.IsDir() {
    92  			bb := &bytes.Buffer{}
    93  			_, err = io.Copy(bb, f)
    94  			if err != nil {
    95  				return err
    96  			}
    97  			mf.data = bb.Bytes()
    98  		}
    99  
   100  		fx.files.Store(mf.Path(), mf)
   101  	}
   102  
   103  	return nil
   104  }