var bigIntZero = big.NewInt(0)
-func Encode(w io.Writer, v any) (written int64, err error) {
+type EncodeOpts struct {
+ // Do not convert time.Time to TAI, assume no conversion is needed.
+ LeaveTAI bool
+}
+
+func Encode(w io.Writer, v any, opts *EncodeOpts) (written int64, err error) {
if v == nil {
return ByteEncode(w, byte(AtomNIL))
}
case BlobReader:
return BlobEncode(w, v.ChunkLen, v.R)
case time.Time:
- v = tai64n.Leapsecs.Add(v)
+ if opts == nil || !opts.LeaveTAI {
+ v = tai64n.Leapsecs.Add(v)
+ }
if v.Nanosecond() > 0 {
var tai tai64n.TAI64N
tai.FromTime(v)
if vv.IsNil() {
return ByteEncode(w, byte(AtomNIL))
}
- return Encode(w, vv.Elem().Interface())
+ return Encode(w, vv.Elem().Interface(), opts)
case reflect.Slice:
_, err = ByteEncode(w, byte(AtomList))
if err != nil {
var n64 int64
if anys, ok := v.([]any); ok {
for _, v := range anys {
- n64, err = Encode(w, v)
+ n64, err = Encode(w, v, opts)
written += n64
if err != nil {
return
}
} else {
for i := 0; i < vv.Len(); i++ {
- n64, err = Encode(w, vv.Index(i).Interface())
+ n64, err = Encode(w, vv.Index(i).Interface(), opts)
written += n64
if err != nil {
return
if err != nil {
return
}
- n64, err = Encode(w, vv.MapIndex(k).Interface())
+ n64, err = Encode(w, vv.MapIndex(k).Interface(), opts)
written += n64
if err != nil {
return
if err != nil {
return
}
- n64, err = Encode(w, fv.Interface())
+ n64, err = Encode(w, fv.Interface(), opts)
written += n64
if err != nil {
return
return
}
-func EncodeBuf(v any) ([]byte, error) {
+func EncodeBuf(v any, opts *EncodeOpts) ([]byte, error) {
var b bytes.Buffer
- _, err := Encode(&b, v)
+ _, err := Encode(&b, v, opts)
return b.Bytes(), err
}