blob: 09df93092e53799c28790f60e666094b91863b21 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This file was auto-generated by the vanadium vdl tool.
// Package: time
// Package time defines standard representations of absolute and relative times.
//
// The representations described below are required to provide wire
// compatibility between different programming environments. Generated code for
// different environments typically provide automatic conversions into native
// representations, for simpler idiomatic usage.
package time
import (
"fmt"
"time"
"v.io/v23/vdl"
)
var _ = __VDLInit() // Must be first; see __VDLInit comments for details.
//////////////////////////////////////////////////
// Type definitions
// Duration represents the elapsed duration between two points in time, with
// up to nanosecond precision.
type Duration struct {
// Seconds represents the seconds in the duration. The range is roughly
// +/-290 billion years, larger than the estimated age of the universe.
Seconds int64
// Nanos represents the fractions of a second at nanosecond resolution. Must
// be in the inclusive range between +/-999,999,999.
//
// In normalized form, durations less than one second are represented with 0
// Seconds and +/-Nanos. For durations one second or more, the sign of Nanos
// must match Seconds, or be 0.
Nanos int32
}
func (Duration) __VDLReflect(struct {
Name string `vdl:"time.Duration"`
}) {
}
func (m *Duration) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
fieldsTarget1, err := t.StartFields(tt)
if err != nil {
return err
}
var4 := (m.Seconds == int64(0))
if var4 {
if err := fieldsTarget1.ZeroField("Seconds"); err != nil && err != vdl.ErrFieldNoExist {
return err
}
} else {
keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Seconds")
if err != vdl.ErrFieldNoExist {
if err != nil {
return err
}
if err := fieldTarget3.FromInt(int64(m.Seconds), tt.NonOptional().Field(0).Type); err != nil {
return err
}
if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
return err
}
}
}
var7 := (m.Nanos == int32(0))
if var7 {
if err := fieldsTarget1.ZeroField("Nanos"); err != nil && err != vdl.ErrFieldNoExist {
return err
}
} else {
keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Nanos")
if err != vdl.ErrFieldNoExist {
if err != nil {
return err
}
if err := fieldTarget6.FromInt(int64(m.Nanos), tt.NonOptional().Field(1).Type); err != nil {
return err
}
if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
return err
}
}
}
if err := t.FinishFields(fieldsTarget1); err != nil {
return err
}
return nil
}
func (m *Duration) MakeVDLTarget() vdl.Target {
return nil
}
type DurationTarget struct {
Value *time.Duration
wireValue Duration
secondsTarget vdl.Int64Target
nanosTarget vdl.Int32Target
vdl.TargetBase
vdl.FieldsTargetBase
}
func (t *DurationTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
t.wireValue = Duration{}
if ttWant := vdl.TypeOf((*Duration)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
}
return t, nil
}
func (t *DurationTarget) StartField(name string) (key, field vdl.Target, _ error) {
switch name {
case "Seconds":
t.secondsTarget.Value = &t.wireValue.Seconds
target, err := &t.secondsTarget, error(nil)
return nil, target, err
case "Nanos":
t.nanosTarget.Value = &t.wireValue.Nanos
target, err := &t.nanosTarget, error(nil)
return nil, target, err
default:
return nil, nil, fmt.Errorf("field %s not in struct time.Duration", name)
}
}
func (t *DurationTarget) FinishField(_, _ vdl.Target) error {
return nil
}
func (t *DurationTarget) ZeroField(name string) error {
switch name {
case "Seconds":
t.wireValue.Seconds = int64(0)
return nil
case "Nanos":
t.wireValue.Nanos = int32(0)
return nil
default:
return fmt.Errorf("field %s not in struct time.Duration", name)
}
}
func (t *DurationTarget) FinishFields(_ vdl.FieldsTarget) error {
if err := DurationToNative(t.wireValue, t.Value); err != nil {
return err
}
return nil
}
func (x Duration) VDLIsZero() bool {
return x == Duration{}
}
func (x Duration) VDLWrite(enc vdl.Encoder) error {
if err := enc.StartValue(vdl.TypeOf((*Duration)(nil)).Elem()); err != nil {
return err
}
if x.Seconds != 0 {
if err := enc.NextField("Seconds"); err != nil {
return err
}
if err := enc.StartValue(vdl.Int64Type); err != nil {
return err
}
if err := enc.EncodeInt(x.Seconds); err != nil {
return err
}
if err := enc.FinishValue(); err != nil {
return err
}
}
if x.Nanos != 0 {
if err := enc.NextField("Nanos"); err != nil {
return err
}
if err := enc.StartValue(vdl.Int32Type); err != nil {
return err
}
if err := enc.EncodeInt(int64(x.Nanos)); err != nil {
return err
}
if err := enc.FinishValue(); err != nil {
return err
}
}
if err := enc.NextField(""); err != nil {
return err
}
return enc.FinishValue()
}
func (x *Duration) VDLRead(dec vdl.Decoder) error {
*x = Duration{}
if err := dec.StartValue(); err != nil {
return err
}
if (dec.StackDepth() == 1 || dec.IsAny()) && !vdl.Compatible(vdl.TypeOf(*x), dec.Type()) {
return fmt.Errorf("incompatible struct %T, from %v", *x, dec.Type())
}
for {
f, err := dec.NextField()
if err != nil {
return err
}
switch f {
case "":
return dec.FinishValue()
case "Seconds":
if err := dec.StartValue(); err != nil {
return err
}
var err error
if x.Seconds, err = dec.DecodeInt(64); err != nil {
return err
}
if err := dec.FinishValue(); err != nil {
return err
}
case "Nanos":
if err := dec.StartValue(); err != nil {
return err
}
tmp, err := dec.DecodeInt(32)
if err != nil {
return err
}
x.Nanos = int32(tmp)
if err := dec.FinishValue(); err != nil {
return err
}
default:
if err := dec.SkipValue(); err != nil {
return err
}
}
}
}
// Time represents an absolute point in time with up to nanosecond precision.
//
// Time is represented as the duration before or after a fixed epoch. The zero
// Time represents the epoch 0001-01-01T00:00:00.000000000Z. This uses the
// proleptic Gregorian calendar; the calendar runs on an exact 400 year cycle.
// Leap seconds are "smeared", ensuring that no leap second table is necessary
// for interpretation.
//
// This is similar to Go time.Time, but always in the UTC location.
// http://golang.org/pkg/time/#Time
//
// This is similar to conventional "unix time", but with the epoch defined at
// year 1 rather than year 1970. This allows the zero Time to be used as a
// natural sentry, since it isn't a valid time for many practical applications.
// http://en.wikipedia.org/wiki/Unix_time
type Time struct {
Seconds int64
Nanos int32
}
func (Time) __VDLReflect(struct {
Name string `vdl:"time.Time"`
}) {
}
func (m *Time) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
fieldsTarget1, err := t.StartFields(tt)
if err != nil {
return err
}
var4 := (m.Seconds == int64(0))
if var4 {
if err := fieldsTarget1.ZeroField("Seconds"); err != nil && err != vdl.ErrFieldNoExist {
return err
}
} else {
keyTarget2, fieldTarget3, err := fieldsTarget1.StartField("Seconds")
if err != vdl.ErrFieldNoExist {
if err != nil {
return err
}
if err := fieldTarget3.FromInt(int64(m.Seconds), tt.NonOptional().Field(0).Type); err != nil {
return err
}
if err := fieldsTarget1.FinishField(keyTarget2, fieldTarget3); err != nil {
return err
}
}
}
var7 := (m.Nanos == int32(0))
if var7 {
if err := fieldsTarget1.ZeroField("Nanos"); err != nil && err != vdl.ErrFieldNoExist {
return err
}
} else {
keyTarget5, fieldTarget6, err := fieldsTarget1.StartField("Nanos")
if err != vdl.ErrFieldNoExist {
if err != nil {
return err
}
if err := fieldTarget6.FromInt(int64(m.Nanos), tt.NonOptional().Field(1).Type); err != nil {
return err
}
if err := fieldsTarget1.FinishField(keyTarget5, fieldTarget6); err != nil {
return err
}
}
}
if err := t.FinishFields(fieldsTarget1); err != nil {
return err
}
return nil
}
func (m *Time) MakeVDLTarget() vdl.Target {
return nil
}
type TimeTarget struct {
Value *time.Time
wireValue Time
secondsTarget vdl.Int64Target
nanosTarget vdl.Int32Target
vdl.TargetBase
vdl.FieldsTargetBase
}
func (t *TimeTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
t.wireValue = Time{}
if ttWant := vdl.TypeOf((*Time)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
}
return t, nil
}
func (t *TimeTarget) StartField(name string) (key, field vdl.Target, _ error) {
switch name {
case "Seconds":
t.secondsTarget.Value = &t.wireValue.Seconds
target, err := &t.secondsTarget, error(nil)
return nil, target, err
case "Nanos":
t.nanosTarget.Value = &t.wireValue.Nanos
target, err := &t.nanosTarget, error(nil)
return nil, target, err
default:
return nil, nil, fmt.Errorf("field %s not in struct time.Time", name)
}
}
func (t *TimeTarget) FinishField(_, _ vdl.Target) error {
return nil
}
func (t *TimeTarget) ZeroField(name string) error {
switch name {
case "Seconds":
t.wireValue.Seconds = int64(0)
return nil
case "Nanos":
t.wireValue.Nanos = int32(0)
return nil
default:
return fmt.Errorf("field %s not in struct time.Time", name)
}
}
func (t *TimeTarget) FinishFields(_ vdl.FieldsTarget) error {
if err := TimeToNative(t.wireValue, t.Value); err != nil {
return err
}
return nil
}
func (x Time) VDLIsZero() bool {
return x == Time{}
}
func (x Time) VDLWrite(enc vdl.Encoder) error {
if err := enc.StartValue(vdl.TypeOf((*Time)(nil)).Elem()); err != nil {
return err
}
if x.Seconds != 0 {
if err := enc.NextField("Seconds"); err != nil {
return err
}
if err := enc.StartValue(vdl.Int64Type); err != nil {
return err
}
if err := enc.EncodeInt(x.Seconds); err != nil {
return err
}
if err := enc.FinishValue(); err != nil {
return err
}
}
if x.Nanos != 0 {
if err := enc.NextField("Nanos"); err != nil {
return err
}
if err := enc.StartValue(vdl.Int32Type); err != nil {
return err
}
if err := enc.EncodeInt(int64(x.Nanos)); err != nil {
return err
}
if err := enc.FinishValue(); err != nil {
return err
}
}
if err := enc.NextField(""); err != nil {
return err
}
return enc.FinishValue()
}
func (x *Time) VDLRead(dec vdl.Decoder) error {
*x = Time{}
if err := dec.StartValue(); err != nil {
return err
}
if (dec.StackDepth() == 1 || dec.IsAny()) && !vdl.Compatible(vdl.TypeOf(*x), dec.Type()) {
return fmt.Errorf("incompatible struct %T, from %v", *x, dec.Type())
}
for {
f, err := dec.NextField()
if err != nil {
return err
}
switch f {
case "":
return dec.FinishValue()
case "Seconds":
if err := dec.StartValue(); err != nil {
return err
}
var err error
if x.Seconds, err = dec.DecodeInt(64); err != nil {
return err
}
if err := dec.FinishValue(); err != nil {
return err
}
case "Nanos":
if err := dec.StartValue(); err != nil {
return err
}
tmp, err := dec.DecodeInt(32)
if err != nil {
return err
}
x.Nanos = int32(tmp)
if err := dec.FinishValue(); err != nil {
return err
}
default:
if err := dec.SkipValue(); err != nil {
return err
}
}
}
}
// WireDeadline represents the deadline for an operation, where the operation is
// expected to finish before the deadline. The intended usage is for a client
// to set a deadline on an operation, say one minute from "now", and send the
// deadline to a server. The server is expected to finish the operation before
// the deadline.
//
// On a single device, it is simplest to represent a deadline as an absolute
// time; when the time now reaches the deadline, the deadline has expired.
// However when sending a deadline between devices with potential clock skew, it
// is often more robust to represent the deadline as a duration from "now". The
// sender computes the duration from its notion of "now", while the receiver
// computes the absolute deadline from its own notion of "now".
//
// This representation doesn't account for propagation delay, but does ensure
// that the deadline used by the receiver is no earlier than the deadline
// intended by the client. In many common scenarios the propagation delay is
// small compared to the potential clock skew, making this a simple but
// effective approach.
//
// WireDeadline typically has a native representation called Deadline that is an
// absolute Time, which automatically performs the sender and receiver
// conversions from "now".
type WireDeadline struct {
// FromNow represents the deadline as a duration from "now".
FromNow time.Duration
// NoDeadline indicates there is no deadline; the analogous sentry for the
// native Deadline is the zero Time.
//
// TODO(toddw): This should be HasDeadline, since the zero value should
// represent "there is no deadline" rather than "the deadline is 0".
NoDeadline bool
}
func (WireDeadline) __VDLReflect(struct {
Name string `vdl:"time.WireDeadline"`
}) {
}
func (m *WireDeadline) FillVDLTarget(t vdl.Target, tt *vdl.Type) error {
fieldsTarget1, err := t.StartFields(tt)
if err != nil {
return err
}
var wireValue2 Duration
if err := DurationFromNative(&wireValue2, m.FromNow); err != nil {
return err
}
var5 := (wireValue2 == Duration{})
if var5 {
if err := fieldsTarget1.ZeroField("FromNow"); err != nil && err != vdl.ErrFieldNoExist {
return err
}
} else {
keyTarget3, fieldTarget4, err := fieldsTarget1.StartField("FromNow")
if err != vdl.ErrFieldNoExist {
if err != nil {
return err
}
if err := wireValue2.FillVDLTarget(fieldTarget4, tt.NonOptional().Field(0).Type); err != nil {
return err
}
if err := fieldsTarget1.FinishField(keyTarget3, fieldTarget4); err != nil {
return err
}
}
}
var8 := (m.NoDeadline == false)
if var8 {
if err := fieldsTarget1.ZeroField("NoDeadline"); err != nil && err != vdl.ErrFieldNoExist {
return err
}
} else {
keyTarget6, fieldTarget7, err := fieldsTarget1.StartField("NoDeadline")
if err != vdl.ErrFieldNoExist {
if err != nil {
return err
}
if err := fieldTarget7.FromBool(bool(m.NoDeadline), tt.NonOptional().Field(1).Type); err != nil {
return err
}
if err := fieldsTarget1.FinishField(keyTarget6, fieldTarget7); err != nil {
return err
}
}
}
if err := t.FinishFields(fieldsTarget1); err != nil {
return err
}
return nil
}
func (m *WireDeadline) MakeVDLTarget() vdl.Target {
return nil
}
type WireDeadlineTarget struct {
Value *Deadline
wireValue WireDeadline
fromNowTarget DurationTarget
noDeadlineTarget vdl.BoolTarget
vdl.TargetBase
vdl.FieldsTargetBase
}
func (t *WireDeadlineTarget) StartFields(tt *vdl.Type) (vdl.FieldsTarget, error) {
t.wireValue = WireDeadline{}
if ttWant := vdl.TypeOf((*WireDeadline)(nil)).Elem(); !vdl.Compatible(tt, ttWant) {
return nil, fmt.Errorf("type %v incompatible with %v", tt, ttWant)
}
return t, nil
}
func (t *WireDeadlineTarget) StartField(name string) (key, field vdl.Target, _ error) {
switch name {
case "FromNow":
t.fromNowTarget.Value = &t.wireValue.FromNow
target, err := &t.fromNowTarget, error(nil)
return nil, target, err
case "NoDeadline":
t.noDeadlineTarget.Value = &t.wireValue.NoDeadline
target, err := &t.noDeadlineTarget, error(nil)
return nil, target, err
default:
return nil, nil, fmt.Errorf("field %s not in struct time.WireDeadline", name)
}
}
func (t *WireDeadlineTarget) FinishField(_, _ vdl.Target) error {
return nil
}
func (t *WireDeadlineTarget) ZeroField(name string) error {
switch name {
case "FromNow":
t.wireValue.FromNow = time.Duration(0)
return nil
case "NoDeadline":
t.wireValue.NoDeadline = false
return nil
default:
return fmt.Errorf("field %s not in struct time.WireDeadline", name)
}
}
func (t *WireDeadlineTarget) FinishFields(_ vdl.FieldsTarget) error {
if err := WireDeadlineToNative(t.wireValue, t.Value); err != nil {
return err
}
return nil
}
func (x WireDeadline) VDLIsZero() bool {
return x == WireDeadline{}
}
func (x WireDeadline) VDLWrite(enc vdl.Encoder) error {
if err := enc.StartValue(vdl.TypeOf((*WireDeadline)(nil)).Elem()); err != nil {
return err
}
if x.FromNow != time.Duration(0) {
if err := enc.NextField("FromNow"); err != nil {
return err
}
var wire Duration
if err := DurationFromNative(&wire, x.FromNow); err != nil {
return err
}
if err := wire.VDLWrite(enc); err != nil {
return err
}
}
if x.NoDeadline {
if err := enc.NextField("NoDeadline"); err != nil {
return err
}
if err := enc.StartValue(vdl.BoolType); err != nil {
return err
}
if err := enc.EncodeBool(x.NoDeadline); err != nil {
return err
}
if err := enc.FinishValue(); err != nil {
return err
}
}
if err := enc.NextField(""); err != nil {
return err
}
return enc.FinishValue()
}
func (x *WireDeadline) VDLRead(dec vdl.Decoder) error {
*x = WireDeadline{}
if err := dec.StartValue(); err != nil {
return err
}
if (dec.StackDepth() == 1 || dec.IsAny()) && !vdl.Compatible(vdl.TypeOf(*x), dec.Type()) {
return fmt.Errorf("incompatible struct %T, from %v", *x, dec.Type())
}
for {
f, err := dec.NextField()
if err != nil {
return err
}
switch f {
case "":
return dec.FinishValue()
case "FromNow":
var wire Duration
if err := wire.VDLRead(dec); err != nil {
return err
}
if err := DurationToNative(wire, &x.FromNow); err != nil {
return err
}
case "NoDeadline":
if err := dec.StartValue(); err != nil {
return err
}
var err error
if x.NoDeadline, err = dec.DecodeBool(); err != nil {
return err
}
if err := dec.FinishValue(); err != nil {
return err
}
default:
if err := dec.SkipValue(); err != nil {
return err
}
}
}
}
// Type-check native conversion functions.
var (
_ func(Duration, *time.Duration) error = DurationToNative
_ func(*Duration, time.Duration) error = DurationFromNative
_ func(Time, *time.Time) error = TimeToNative
_ func(*Time, time.Time) error = TimeFromNative
_ func(WireDeadline, *Deadline) error = WireDeadlineToNative
_ func(*WireDeadline, Deadline) error = WireDeadlineFromNative
)
var __VDLInitCalled bool
// __VDLInit performs vdl initialization. It is safe to call multiple times.
// If you have an init ordering issue, just insert the following line verbatim
// into your source files in this package, right after the "package foo" clause:
//
// var _ = __VDLInit()
//
// The purpose of this function is to ensure that vdl initialization occurs in
// the right order, and very early in the init sequence. In particular, vdl
// registration and package variable initialization needs to occur before
// functions like vdl.TypeOf will work properly.
//
// This function returns a dummy value, so that it can be used to initialize the
// first var in the file, to take advantage of Go's defined init order.
func __VDLInit() struct{} {
if __VDLInitCalled {
return struct{}{}
}
__VDLInitCalled = true
// Register native type conversions first, so that vdl.TypeOf works.
vdl.RegisterNative(DurationToNative, DurationFromNative)
vdl.RegisterNative(TimeToNative, TimeFromNative)
vdl.RegisterNative(WireDeadlineToNative, WireDeadlineFromNative)
// Register types.
vdl.Register((*Duration)(nil))
vdl.Register((*Time)(nil))
vdl.Register((*WireDeadline)(nil))
return struct{}{}
}