// 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.

package testdata

import "time"

type AddressInfo struct {
	Street string
	City   string
	State  string
	Zip    string
}

type CreditAgency enum {
	Equifax
	Experian
	TransUnion
}

type ExperianRating enum {
	Good
	Bad
}

type EquifaxCreditReport struct {
	Rating byte
}

type ExperianCreditReport struct {
	Rating ExperianRating
}

type TransUnionCreditReport struct {
	Rating int16
}

type AgencyReport union {
	EquifaxReport    EquifaxCreditReport
	ExperianReport   ExperianCreditReport
	TransUnionReport TransUnionCreditReport
}

type CreditReport struct {
	Agency CreditAgency
	Report AgencyReport
}

type Customer struct {
	Name    string
	Id      int64
	Active  bool
	Address AddressInfo
	Credit  CreditReport
}

type Invoice struct {
	CustId      int64
	InvoiceNum  int64
	InvoiceDate time.Time
	Amount      int64
	ShipTo      AddressInfo
}

type Numbers struct {
	B    byte
	Ui16 uint16
	Ui32 uint32
	Ui64 uint64
	I16  int16
	I32  int32
	I64  int64
	F32  float32
	F64  float64
}

type FooType struct {
	Bar BarType
}

type BarType struct {
	Baz BazType
}

type TitleOrValueType union {
	Title string
	Value int64
}

type BazType struct {
	Name         string
	TitleOrValue TitleOrValueType
}

type ArrayOfFour [4]string

type KeyIndexData struct {
	A ArrayOfFour
	L []string
	M map[int64]string
	S set[string]
}

type BigData struct {
	Key string // A dup of the key stored in the value.
}
