]> git.r.bdr.sh - rbdr/mobius/blob - hotline/file_header.go
Fix io.Reader implementations and wrap more errors
[rbdr/mobius] / hotline / file_header.go
1 package hotline
2
3 import (
4 "encoding/binary"
5 "io"
6 "slices"
7 )
8
9 type FileHeader struct {
10 Size [2]byte // Total size of FileHeader payload
11 Type [2]byte // 0 for file, 1 for dir
12 FilePath []byte // encoded file path
13
14 readOffset int // Internal offset to track read progress
15 }
16
17 func NewFileHeader(fileName string, isDir bool) FileHeader {
18 fh := FileHeader{
19 Type: [2]byte{0x00, 0x00},
20 FilePath: EncodeFilePath(fileName),
21 }
22 if isDir {
23 fh.Type = [2]byte{0x00, 0x01}
24 }
25
26 encodedPathLen := uint16(len(fh.FilePath) + len(fh.Type))
27 binary.BigEndian.PutUint16(fh.Size[:], encodedPathLen)
28
29 return fh
30 }
31
32 func (fh *FileHeader) Read(p []byte) (int, error) {
33 buf := slices.Concat(
34 fh.Size[:],
35 fh.Type[:],
36 fh.FilePath,
37 )
38
39 if fh.readOffset >= len(buf) {
40 return 0, io.EOF // All bytes have been read
41 }
42
43 n := copy(p, buf[fh.readOffset:])
44 fh.readOffset += n
45
46 return n, nil
47 }