From 22c599abc18895f73e96095f35b71cf3357d41b4 Mon Sep 17 00:00:00 2001 From: Jeff Halter <868228+jhalter@users.noreply.github.com> Date: Wed, 28 Jul 2021 18:21:52 -0700 Subject: Move code to hotline dir --- hotline/file_path.go | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 hotline/file_path.go (limited to 'hotline/file_path.go') 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) +} -- cgit