github.com/stafiprotocol/go-substrate-rpc-client@v1.4.7/types/moment.go (about) 1 // Go Substrate RPC Client (GSRPC) provides APIs and types around Polkadot and any Substrate-based chain RPC calls 2 // 3 // Copyright 2020 Stafi Protocol 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 package types 18 19 import ( 20 "fmt" 21 "math" 22 "time" 23 24 "github.com/stafiprotocol/go-substrate-rpc-client/pkg/scale" 25 ) 26 27 const ( 28 NanosInSecond = 1e9 29 MillisInSecond = 1e3 30 ) 31 32 // Moment is a wrapper around milliseconds/timestamps using the `time.Time` type. 33 type Moment struct { 34 time.Time 35 } 36 37 // NewMoment creates a new Moment type 38 func NewMoment(t time.Time) Moment { 39 return Moment{t} 40 } 41 42 func (m *Moment) Decode(decoder scale.Decoder) error { 43 var u uint64 44 err := decoder.Decode(&u) 45 if err != nil { 46 return err 47 } 48 49 // Error in case of overflow 50 if u > math.MaxInt64 { 51 return fmt.Errorf("cannot decode a uint64 into a Moment if it overflows int64") 52 } 53 54 secs := u / MillisInSecond 55 nanos := (u % uint64(MillisInSecond)) * uint64(NanosInSecond) 56 57 *m = NewMoment(time.Unix(int64(secs), int64(nanos))) 58 59 return nil 60 } 61 62 func (m Moment) Encode(encoder scale.Encoder) error { 63 err := encoder.Encode(uint64(m.UnixNano() / (NanosInSecond / MillisInSecond))) 64 if err != nil { 65 return err 66 } 67 68 return nil 69 }