Files
Some-Tools-Useful/language-change/excel-language/row.go
2025-10-18 11:36:48 +07:00

82 lines
1.4 KiB
Go

package excelLanguage
import (
"bytes"
"errors"
)
type LanguageRow struct {
Area *string
Type *uint8
LanguageList []string
DefaultLanguage *string
}
func (r *LanguageRow) Unmarshal() ([]byte, error) {
buf := new(bytes.Buffer)
var bitmask uint8
if r.Area != nil {
bitmask |= 1 << 0
}
if r.Type != nil {
bitmask |= 1 << 1
}
if len(r.LanguageList) > 0 {
bitmask |= 1 << 2
}
if r.DefaultLanguage != nil {
bitmask |= 1 << 3
}
if err := buf.WriteByte(bitmask); err != nil {
return nil, err
}
if r.Area != nil {
if err := writeString(buf, *r.Area); err != nil {
return nil, err
}
}
if r.Type != nil {
if err := buf.WriteByte(*r.Type); err != nil {
return nil, err
}
}
if len(r.LanguageList) > 0 {
if err := writeStringArray(buf, r.LanguageList); err != nil {
return nil, err
}
}
if r.DefaultLanguage != nil {
if err := writeString(buf, *r.DefaultLanguage); err != nil {
return nil, err
}
}
return buf.Bytes(), nil
}
func writeString(buf *bytes.Buffer, s string) error {
if len(s) > 255 {
return errors.New("string too long")
}
if err := buf.WriteByte(uint8(len(s))); err != nil {
return err
}
_, err := buf.Write([]byte(s))
return err
}
func writeStringArray(buf *bytes.Buffer, arr []string) error {
if err := writeI8Varint(buf, int8(len(arr))); err != nil {
return err
}
for _, s := range arr {
if err := writeString(buf, s); err != nil {
return err
}
}
return nil
}