mirror of
https://github.com/therootcompany/golib.git
synced 2026-11-04 06:55:00 +00:00
77 lines
1.6 KiB
Go
77 lines
1.6 KiB
Go
package csvx
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/jszwec/csvutil"
|
|
)
|
|
|
|
// Marshalers returns csvutil.Marshalers for generic types that don't have
|
|
// their own MarshalCSV method.
|
|
func Marshalers() *csvutil.Marshalers {
|
|
return csvutil.NewMarshalers(
|
|
csvutil.MarshalFunc[[]string](func(s []string) ([]byte, error) {
|
|
if len(s) == 0 {
|
|
return nil, nil
|
|
}
|
|
return []byte(strings.Join(s, ",")), nil
|
|
}),
|
|
csvutil.MarshalFunc[*bool](func(b *bool) ([]byte, error) {
|
|
if b == nil {
|
|
return nil, nil
|
|
}
|
|
return []byte(strconv.FormatBool(*b)), nil
|
|
}),
|
|
csvutil.MarshalFunc[[]byte](func(b []byte) ([]byte, error) {
|
|
if len(b) == 0 {
|
|
return nil, nil
|
|
}
|
|
return []byte(hex.EncodeToString(b)), nil
|
|
}),
|
|
)
|
|
}
|
|
|
|
// Unmarshalers returns csvutil.Unmarshalers for generic types that don't have
|
|
// their own UnmarshalCSV method.
|
|
func Unmarshalers() *csvutil.Unmarshalers {
|
|
return csvutil.NewUnmarshalers(
|
|
csvutil.UnmarshalFunc[*[]string](func(data []byte, s *[]string) error {
|
|
str := string(data)
|
|
if str == "" {
|
|
*s = nil
|
|
return nil
|
|
}
|
|
*s = strings.Split(str, ",")
|
|
return nil
|
|
}),
|
|
csvutil.UnmarshalFunc[*bool](func(data []byte, b *bool) error {
|
|
s := string(data)
|
|
if s == "" {
|
|
*b = false
|
|
return nil
|
|
}
|
|
v, err := strconv.ParseBool(strings.TrimSpace(s))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*b = v
|
|
return nil
|
|
}),
|
|
csvutil.UnmarshalFunc[*[]byte](func(data []byte, b *[]byte) error {
|
|
s := string(data)
|
|
if s == "" {
|
|
*b = nil
|
|
return nil
|
|
}
|
|
decoded, err := hex.DecodeString(s)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
*b = decoded
|
|
return nil
|
|
}),
|
|
)
|
|
}
|