// 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{}{}
}
