- Deleted old deb822_encode.go and deb822_types.go files. - Introduced new deb822_encode.go with improved Marshall function and Writer struct for encoding. - Added deb822_decode.go for decoding functionality with enhanced error handling. - Created deb822_rawdata.go to define RawData type for handling raw deb822 values. - Implemented Description type in deb822/datatype/description.go for structured description handling. - Updated Package struct in dpkg/header.go to use new Description type. - Refactored UnmarshalBinary method in dpkg/header.go to utilize new deb822 decoding logic. - Added comprehensive tests for encoding and decoding in deb822_encode_test.go and deb822_decode_test.go. - Removed internal scanner package as it was no longer needed. Signed-off-by: Matheus Sampaio Queiroga <srherobrine20@gmail.com>
97 lines
1.6 KiB
Go
97 lines
1.6 KiB
Go
package deb822
|
|
|
|
import (
|
|
"io"
|
|
"iter"
|
|
"strings"
|
|
"sync"
|
|
"unicode"
|
|
)
|
|
|
|
type Writer struct {
|
|
w io.Writer
|
|
locker *sync.Mutex
|
|
}
|
|
|
|
func NewWriter(w io.Writer) *Writer {
|
|
return &Writer{
|
|
w: w,
|
|
locker: &sync.Mutex{},
|
|
}
|
|
}
|
|
|
|
func (w *Writer) Add(key, value string) (total int64, err error) {
|
|
w.locker.Lock()
|
|
defer w.locker.Unlock()
|
|
|
|
// Check if valid key
|
|
if strings.ContainsFunc(key, unicode.IsSpace) {
|
|
return 0, ErrInvalidDeb822
|
|
}
|
|
|
|
var n int64
|
|
for n != int64(len(key)) {
|
|
b, err := w.w.Write([]byte(key)[n:])
|
|
n += int64(b)
|
|
if err != nil {
|
|
return n, err
|
|
}
|
|
}
|
|
total = n
|
|
n = 0
|
|
for n != 2 {
|
|
b, err := w.w.Write([]byte(": ")[n:])
|
|
n += int64(b)
|
|
if err != nil {
|
|
return total + n, err
|
|
}
|
|
}
|
|
total += n
|
|
|
|
{
|
|
value = strings.TrimSpace(value)
|
|
if strings.Count(value, "\n") > 1 {
|
|
lines := strings.SplitN(value, "\n", 2)
|
|
lines[0] = strings.TrimSpace(lines[0])
|
|
lines[1] = strings.TrimSpace(lines[1])
|
|
newLines := strings.Split(lines[1], "\n")
|
|
for i := range newLines {
|
|
if strings.TrimSpace(newLines[i]) == "" {
|
|
newLines[i] = " ."
|
|
continue
|
|
}
|
|
newLines[i] = " " + newLines[i]
|
|
}
|
|
lines[1] = strings.Join(newLines, "\n")
|
|
value = strings.Join(lines, "\n")
|
|
}
|
|
}
|
|
|
|
n = 0
|
|
for n != int64(len(value)) {
|
|
b, err := w.w.Write([]byte(value)[n:])
|
|
n += int64(b)
|
|
if err != nil {
|
|
return total + n, err
|
|
}
|
|
}
|
|
total += n
|
|
|
|
b, err := w.w.Write([]byte("\n"))
|
|
if err != nil {
|
|
return total + int64(b), err
|
|
}
|
|
total += int64(b)
|
|
|
|
return
|
|
}
|
|
|
|
func (w *Writer) FromIter(r iter.Seq2[string, string]) error {
|
|
for key, value := range r {
|
|
if _, err := w.Add(key, value); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|