github.com/mgoltzsche/ctnr@v0.7.1-alpha/pkg/fs/writer/stringwriter.go (about)

     1  package writer
     2  
     3  import (
     4  	"io"
     5  	"net/url"
     6  	"path/filepath"
     7  
     8  	"github.com/mgoltzsche/ctnr/pkg/fs"
     9  	"github.com/pkg/errors"
    10  )
    11  
    12  type StringWriter struct {
    13  	writer io.Writer
    14  	attrs  fs.AttrSet
    15  }
    16  
    17  func NewStringWriter(writer io.Writer, attrs fs.AttrSet) (w fs.Writer) {
    18  	return &StringWriter{writer, attrs}
    19  }
    20  
    21  func (w *StringWriter) Parent() (err error) {
    22  	_, err = w.writer.Write([]byte("..\n"))
    23  	return
    24  }
    25  
    26  func (w *StringWriter) writeEntry(path, attrs string) (err error) {
    27  	path = filepath.Base(path)
    28  	if path == string(filepath.Separator) {
    29  		path = "."
    30  	}
    31  	_, err = w.writer.Write([]byte(url.PathEscape(path) + " " + attrs + "\n"))
    32  	return
    33  }
    34  
    35  func (w *StringWriter) writeAttrs(path string, attrs *fs.NodeAttrs) (err error) {
    36  	return w.writeEntry(path, attrs.AttrString(w.attrs))
    37  }
    38  
    39  func (w *StringWriter) LowerNode(path, name string, a *fs.NodeAttrs) (err error) {
    40  	return w.writeAttrs(name, a)
    41  }
    42  
    43  func (w *StringWriter) Lazy(path, name string, src fs.LazySource, _ map[fs.Source]string) (err error) {
    44  	var a fs.DerivedAttrs
    45  	if w.attrs&fs.AttrsHash != 0 {
    46  		if a, err = src.DeriveAttrs(); err != nil {
    47  			return errors.Wrapf(err, "stringwriter: lazy %s", path)
    48  		}
    49  	}
    50  	return w.writeAttrs(name, &fs.NodeAttrs{src.Attrs(), a})
    51  }
    52  
    53  func (w *StringWriter) File(path string, src fs.FileSource) (r fs.Source, err error) {
    54  	var a fs.DerivedAttrs
    55  	if w.attrs&fs.AttrsHash != 0 {
    56  		if a, err = src.DeriveAttrs(); err != nil {
    57  			return nil, errors.Wrapf(err, "stringwriter: file %s", path)
    58  		}
    59  	}
    60  	err = w.writeAttrs(path, &fs.NodeAttrs{src.Attrs(), a})
    61  	return src, err
    62  }
    63  
    64  func (w *StringWriter) Link(path, target string) (err error) {
    65  	return w.writeEntry(path, "hlink="+target)
    66  }
    67  
    68  func (w *StringWriter) LowerLink(path, target string, a *fs.NodeAttrs) (err error) {
    69  	return w.Link(path, target)
    70  }
    71  
    72  func (w *StringWriter) Symlink(path string, a fs.FileAttrs) (err error) {
    73  	return w.writeAttrs(path, &fs.NodeAttrs{fs.NodeInfo{fs.TypeSymlink, a}, fs.DerivedAttrs{}})
    74  }
    75  
    76  func (w *StringWriter) Fifo(path string, a fs.DeviceAttrs) (err error) {
    77  	return w.writeAttrs(path, &fs.NodeAttrs{fs.NodeInfo{fs.TypeFifo, a.FileAttrs}, fs.DerivedAttrs{}})
    78  }
    79  
    80  func (w *StringWriter) Device(path string, a fs.DeviceAttrs) (err error) {
    81  	return w.writeAttrs(path, &fs.NodeAttrs{fs.NodeInfo{fs.TypeDevice, a.FileAttrs}, fs.DerivedAttrs{}})
    82  }
    83  
    84  func (w *StringWriter) Dir(path, name string, a fs.FileAttrs) (err error) {
    85  	return w.writeAttrs(name, &fs.NodeAttrs{fs.NodeInfo{fs.TypeDir, a}, fs.DerivedAttrs{}})
    86  }
    87  
    88  func (w *StringWriter) Mkdir(path string) (err error) {
    89  	return w.writeEntry(path, "type="+string(fs.TypeDir))
    90  }
    91  
    92  func (w *StringWriter) Remove(path string) (err error) {
    93  	return w.writeEntry(path, "type="+string(fs.TypeWhiteout))
    94  }