diff options
| author | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2021-07-28 18:21:52 -0700 |
|---|---|---|
| committer | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2021-07-28 14:21:52 -0700 |
| commit | 22c599abc18895f73e96095f35b71cf3357d41b4 (patch) | |
| tree | 482ef57d386c955692ea43c43e4655b3c3763499 /hotline/file_path.go | |
| parent | 71c56068adca18f76ebee86355f000a3e51d3127 (diff) | |
Move code to hotline dir
Diffstat (limited to 'hotline/file_path.go')
| -rw-r--r-- | hotline/file_path.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/hotline/file_path.go b/hotline/file_path.go new file mode 100644 index 0000000..71168dc --- /dev/null +++ b/hotline/file_path.go @@ -0,0 +1,56 @@ +package hotline + +import ( + "encoding/binary" + "strings" +) + +const pathSeparator = "/" // File path separator TODO: make configurable to support Windows + +// FilePathItem represents the file or directory portion of a delimited file path (e.g. foo and bar in "/foo/bar") +// 00 00 +// 09 +// 73 75 62 66 6f 6c 64 65 72 // "subfolder" +type FilePathItem struct { + Len byte + Name []byte +} + +func NewFilePathItem(b []byte) FilePathItem { + return FilePathItem{ + Len: b[2], + Name: b[3:], + } +} + +type FilePath struct { + PathItemCount []byte + PathItems []FilePathItem +} + +func NewFilePath(b []byte) FilePath { + if b == nil { + return FilePath{} + } + + fp := FilePath{PathItemCount: b[0:2]} + + // number of items in the path + pathItemLen := binary.BigEndian.Uint16(b[0:2]) + pathData := b[2:] + for i := uint16(0); i < pathItemLen; i++ { + segLen := pathData[2] + fp.PathItems = append(fp.PathItems, NewFilePathItem(pathData[:segLen+3])) + pathData = pathData[3+segLen:] + } + + return fp +} + +func (fp *FilePath) String() string { + var out []string + for _, i := range fp.PathItems { + out = append(out, string(i.Name)) + } + return strings.Join(out, pathSeparator) +} |