Files
go-dpkg/deb822/writer.go
Matheus Sampaio Queiroga 8cf5fcbfc3
All checks were successful
Golang test / go-test (pull_request) Successful in 21s
Golang test / go-test (push) Successful in 21s
Refactor deb822 package: Remove deprecated files and implement new encoding/decoding logic
- 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>
2025-06-22 22:05:41 -03:00

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
}