// 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: nativedep

package nativedep

import (
	"time"
	"v.io/v23/vdl"
	"v.io/v23/vdl/testdata/nativetest"
	nativetest_2 "v.io/x/ref/lib/vdl/testdata/nativetest"
)

var _ = __VDLInit() // Must be first; see __VDLInit comments for details.

//////////////////////////////////////////////////
// Type definitions

type All struct {
	A string
	B time.Time
	C nativetest.NativeSamePkg
	D map[nativetest.NativeSamePkg]time.Time
}

func (All) __VDLReflect(struct {
	Name string `vdl:"v.io/x/ref/lib/vdl/testdata/nativedep.All"`
}) {
}

func (x All) VDLIsZero() bool {
	if x.A != "" {
		return false
	}
	if !x.B.IsZero() {
		return false
	}
	if x.C != "" {
		return false
	}
	if x.D != nil {
		return false
	}
	return true
}

func (x All) VDLWrite(enc vdl.Encoder) error {
	if err := enc.StartValue(__VDLType_struct_1); err != nil {
		return err
	}
	if x.A != "" {
		if err := enc.NextField("A"); err != nil {
			return err
		}
		var wire nativetest_2.WireString
		if err := nativetest_2.WireStringFromNative(&wire, x.A); err != nil {
			return err
		}
		if err := wire.VDLWrite(enc); err != nil {
			return err
		}
	}
	if !x.B.IsZero() {
		if err := enc.NextField("B"); err != nil {
			return err
		}
		var wire nativetest_2.WireTime
		if err := nativetest_2.WireTimeFromNative(&wire, x.B); err != nil {
			return err
		}
		if err := wire.VDLWrite(enc); err != nil {
			return err
		}
	}
	if x.C != "" {
		if err := enc.NextField("C"); err != nil {
			return err
		}
		var wire nativetest_2.WireSamePkg
		if err := nativetest_2.WireSamePkgFromNative(&wire, x.C); err != nil {
			return err
		}
		if err := wire.VDLWrite(enc); err != nil {
			return err
		}
	}
	if x.D != nil {
		if err := enc.NextField("D"); err != nil {
			return err
		}
		var wire nativetest_2.WireMultiImport
		if err := nativetest_2.WireMultiImportFromNative(&wire, x.D); err != nil {
			return err
		}
		if err := wire.VDLWrite(enc); err != nil {
			return err
		}
	}
	if err := enc.NextField(""); err != nil {
		return err
	}
	return enc.FinishValue()
}

func (x *All) VDLRead(dec vdl.Decoder) error {
	*x = All{}
	if err := dec.StartValue(__VDLType_struct_1); err != nil {
		return err
	}
	for {
		f, err := dec.NextField()
		if err != nil {
			return err
		}
		switch f {
		case "":
			return dec.FinishValue()
		case "A":
			var wire nativetest_2.WireString
			if err := wire.VDLRead(dec); err != nil {
				return err
			}
			if err := nativetest_2.WireStringToNative(wire, &x.A); err != nil {
				return err
			}
		case "B":
			var wire nativetest_2.WireTime
			if err := wire.VDLRead(dec); err != nil {
				return err
			}
			if err := nativetest_2.WireTimeToNative(wire, &x.B); err != nil {
				return err
			}
		case "C":
			var wire nativetest_2.WireSamePkg
			if err := wire.VDLRead(dec); err != nil {
				return err
			}
			if err := nativetest_2.WireSamePkgToNative(wire, &x.C); err != nil {
				return err
			}
		case "D":
			var wire nativetest_2.WireMultiImport
			if err := wire.VDLRead(dec); err != nil {
				return err
			}
			if err := nativetest_2.WireMultiImportToNative(wire, &x.D); err != nil {
				return err
			}
		default:
			if err := dec.SkipValue(); err != nil {
				return err
			}
		}
	}
}

// Hold type definitions in package-level variables, for better performance.
var (
	__VDLType_struct_1 *vdl.Type
	__VDLType_int32_2  *vdl.Type
	__VDLType_int32_3  *vdl.Type
	__VDLType_int32_4  *vdl.Type
	__VDLType_int32_5  *vdl.Type
)

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 types.
	vdl.Register((*All)(nil))

	// Initialize type definitions.
	__VDLType_struct_1 = vdl.TypeOf((*All)(nil)).Elem()
	__VDLType_int32_2 = vdl.TypeOf((*nativetest_2.WireString)(nil))
	__VDLType_int32_3 = vdl.TypeOf((*nativetest_2.WireTime)(nil))
	__VDLType_int32_4 = vdl.TypeOf((*nativetest_2.WireSamePkg)(nil))
	__VDLType_int32_5 = vdl.TypeOf((*nativetest_2.WireMultiImport)(nil))

	return struct{}{}
}
