// 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.
// Source: time.vdl

// 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 (
	// VDL system imports
	"v.io/v23/vdl"

	// VDL user imports
	"time"
)

// 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"`
}) {
}

// 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"`
}) {
}

// 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.
	NoDeadline bool
}

func (WireDeadline) __VDLReflect(struct {
	Name string `vdl:"time.WireDeadline"`
}) {
}

func init() {
	vdl.RegisterNative(durationToNative, durationFromNative)
	vdl.RegisterNative(timeToNative, timeFromNative)
	vdl.RegisterNative(wireDeadlineToNative, wireDeadlineFromNative)
	vdl.Register((*Time)(nil))
	vdl.Register((*Duration)(nil))
	vdl.Register((*WireDeadline)(nil))
}

// Type-check Duration conversion functions.
var _ func(Duration, *time.Duration) error = durationToNative
var _ func(*Duration, time.Duration) error = durationFromNative

// Type-check Time conversion functions.
var _ func(Time, *time.Time) error = timeToNative
var _ func(*Time, time.Time) error = timeFromNative

// Type-check WireDeadline conversion functions.
var _ func(WireDeadline, *Deadline) error = wireDeadlineToNative
var _ func(*WireDeadline, Deadline) error = wireDeadlineFromNative
