| package cbor |
| |
| import ( |
| "time" |
| ) |
| |
| func appendIntegerTimestamp(dst []byte, t time.Time) []byte { |
| major := majorTypeTags |
| minor := additionalTypeTimestamp |
| dst = append(dst, byte(major|minor)) |
| secs := t.Unix() |
| var val uint64 |
| if secs < 0 { |
| major = majorTypeNegativeInt |
| val = uint64(-secs - 1) |
| } else { |
| major = majorTypeUnsignedInt |
| val = uint64(secs) |
| } |
| dst = appendCborTypePrefix(dst, major, uint64(val)) |
| return dst |
| } |
| |
| func (e Encoder) appendFloatTimestamp(dst []byte, t time.Time) []byte { |
| major := majorTypeTags |
| minor := additionalTypeTimestamp |
| dst = append(dst, byte(major|minor)) |
| secs := t.Unix() |
| nanos := t.Nanosecond() |
| var val float64 |
| val = float64(secs)*1.0 + float64(nanos)*1E-9 |
| return e.AppendFloat64(dst, val) |
| } |
| |
| // AppendTime encodes and adds a timestamp to the dst byte array. |
| func (e Encoder) AppendTime(dst []byte, t time.Time, unused string) []byte { |
| utc := t.UTC() |
| if utc.Nanosecond() == 0 { |
| return appendIntegerTimestamp(dst, utc) |
| } |
| return e.appendFloatTimestamp(dst, utc) |
| } |
| |
| // AppendTimes encodes and adds an array of timestamps to the dst byte array. |
| func (e Encoder) AppendTimes(dst []byte, vals []time.Time, unused string) []byte { |
| major := majorTypeArray |
| l := len(vals) |
| if l == 0 { |
| return e.AppendArrayEnd(e.AppendArrayStart(dst)) |
| } |
| if l <= additionalMax { |
| lb := byte(l) |
| dst = append(dst, byte(major|lb)) |
| } else { |
| dst = appendCborTypePrefix(dst, major, uint64(l)) |
| } |
| |
| for _, t := range vals { |
| dst = e.AppendTime(dst, t, unused) |
| } |
| return dst |
| } |
| |
| // AppendDuration encodes and adds a duration to the dst byte array. |
| // useInt field indicates whether to store the duration as seconds (integer) or |
| // as seconds+nanoseconds (float). |
| func (e Encoder) AppendDuration(dst []byte, d time.Duration, unit time.Duration, useInt bool) []byte { |
| if useInt { |
| return e.AppendInt64(dst, int64(d/unit)) |
| } |
| return e.AppendFloat64(dst, float64(d)/float64(unit)) |
| } |
| |
| // AppendDurations encodes and adds an array of durations to the dst byte array. |
| // useInt field indicates whether to store the duration as seconds (integer) or |
| // as seconds+nanoseconds (float). |
| func (e Encoder) AppendDurations(dst []byte, vals []time.Duration, unit time.Duration, useInt bool) []byte { |
| major := majorTypeArray |
| l := len(vals) |
| if l == 0 { |
| return e.AppendArrayEnd(e.AppendArrayStart(dst)) |
| } |
| if l <= additionalMax { |
| lb := byte(l) |
| dst = append(dst, byte(major|lb)) |
| } else { |
| dst = appendCborTypePrefix(dst, major, uint64(l)) |
| } |
| for _, d := range vals { |
| dst = e.AppendDuration(dst, d, unit, useInt) |
| } |
| return dst |
| } |