github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/extra/time_as_int64_codec.go (about)

     1  package extra
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  	"unsafe"
     7  
     8  	"github.com/bingoohuang/gg/pkg/jsoni"
     9  )
    10  
    11  // RegisterTimeAsInt64Codec encode/decode time since number of unit since epoch. the precision is the unit.
    12  func RegisterTimeAsInt64Codec(precision time.Duration) {
    13  	jsoni.RegisterTypeEncoder("time.Time", &timeAsInt64Codec{precision})
    14  	jsoni.RegisterTypeDecoder("time.Time", &timeAsInt64Codec{precision})
    15  }
    16  
    17  type timeAsInt64Codec struct {
    18  	precision time.Duration
    19  }
    20  
    21  func (codec *timeAsInt64Codec) Decode(_ context.Context, ptr unsafe.Pointer, iter *jsoni.Iterator) {
    22  	nanoseconds := iter.ReadInt64() * codec.precision.Nanoseconds()
    23  	*((*time.Time)(ptr)) = time.Unix(0, nanoseconds)
    24  }
    25  
    26  func (codec *timeAsInt64Codec) IsEmpty(_ context.Context, ptr unsafe.Pointer, _ bool) bool {
    27  	ts := *((*time.Time)(ptr))
    28  	return ts.UnixNano() == 0
    29  }
    30  
    31  func (codec *timeAsInt64Codec) Encode(_ context.Context, ptr unsafe.Pointer, stream *jsoni.Stream) {
    32  	ts := *((*time.Time)(ptr))
    33  	stream.WriteInt64(ts.UnixNano() / codec.precision.Nanoseconds())
    34  }