aboutsummaryrefslogtreecommitdiff
path: root/hotline/file_path.go
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2021-07-28 18:21:52 -0700
committerJeff Halter <868228+jhalter@users.noreply.github.com>2021-07-28 14:21:52 -0700
commit22c599abc18895f73e96095f35b71cf3357d41b4 (patch)
tree482ef57d386c955692ea43c43e4655b3c3763499 /hotline/file_path.go
parent71c56068adca18f76ebee86355f000a3e51d3127 (diff)
Move code to hotline dir
Diffstat (limited to 'hotline/file_path.go')
-rw-r--r--hotline/file_path.go56
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)
+}