// Copyright 2016 Istio Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package v1

import (
	"googleapis.com/acme/test"
	"googleapis.com/acme/test/test"
	"time"
)

#StructWrap: {
	struct?: {} @protobuf(1,type=google.protobuf.Struct)
	any?: _ @protobuf(2,type=google.protobuf.Value)
	listVal?: [...] @protobuf(3,type=google.protobuf.ListValue)
	boolVal?:   bool   @protobuf(4,type=google.protobuf.BoolValue)
	stringVal?: string @protobuf(5,type=google.protobuf.StringValue)
	numberVal?: number @protobuf(6,type=google.protobuf.NumberValue)
}

// Attributes represents a set of typed name/value pairs. Many of Mixer's
// API either consume and/or return attributes.
//
// Istio uses attributes to control the runtime behavior of services running in the service mesh.
// Attributes are named and typed pieces of metadata describing ingress and egress traffic and the
// environment this traffic occurs in. An Istio attribute carries a specific piece
// of information such as the error code of an API request, the latency of an API request, or the
// original IP address of a TCP connection. For example:
//
// ```yaml
// request.path: xyz/abc
// request.size: 234
// request.time: 12:34:56.789 04/17/2017
// source.ip: 192.168.0.1
// target.service: example
// ```
//
#Attributes: {
	// A map of attribute name to its value.
	attributes?: {
		[string]: #AttributeValue
	} @protobuf(1,type=map<string,AttributeValue>)

	// Specifies one attribute value with different type.
	#AttributeValue: {
		// The attribute value.
		close({}) | close({
			// Used for values of type STRING, DNS_NAME, EMAIL_ADDRESS, and URI
			stringValue: string @protobuf(2,name=string_value)
		}) | close({
			// Used for values of type INT64
			int64Value: int64 @protobuf(3,name=int64_value)
		}) | close({
			// Used for values of type DOUBLE
			doubleValue: float64 @protobuf(4,type=double,name=double_value)
		}) | close({
			// Used for values of type BOOL
			boolValue: bool @protobuf(5,name=bool_value)
		}) | close({
			// Used for values of type BYTES
			bytesValue: bytes @protobuf(6,name=bytes_value)
		}) | close({
			// Used for values of type TIMESTAMP
			timestampValue: time.Time @protobuf(7,type=google.protobuf.Timestamp,name=timestamp_value)
		}) | close({
			// Used for values of type DURATION
			durationValue: time.Duration @protobuf(8,type=google.protobuf.Duration,name=duration_value)
		}) | close({
			// Used for values of type STRING_MAP
			stringMapValue: #StringMap @protobuf(9,name=string_map_value)
		}) | close({
			testValue: test.#Test @protobuf(10,type=acme.test.Test,name=test_value)
		}) | close({
			testValue: test_test.#AnotherTest @protobuf(11,type=acme.test.test.AnotherTest,name=test_value)
		})
	}

	// Defines a string map.
	#StringMap: {
		// Holds a set of name/value pairs.
		entries?: {
			[string]: string
		} @protobuf(1,type=map<string,string>)
	}
}

// Defines a list of attributes in compressed format optimized for transport.
// Within this message, strings are referenced using integer indices into
// one of two string dictionaries. Positive integers index into the global
// deployment-wide dictionary, whereas negative integers index into the message-level
// dictionary instead. The message-level dictionary is carried by the
// `words` field of this message, the deployment-wide dictionary is determined via
// configuration.
#CompressedAttributes: {
	// The message-level dictionary.
	words?: [...string] @protobuf(1)

	// Holds attributes of type STRING, DNS_NAME, EMAIL_ADDRESS, URI
	strings?: {
		[string]: int32
	} @protobuf(2,type=map<sint32,sint32>)

	// Holds attributes of type INT64
	int64s?: {
		[string]: int64
	} @protobuf(3,type=map<sint32,int64>)

	// Holds attributes of type DOUBLE
	doubles?: {
		[string]: float64
	} @protobuf(4,type=map<sint32,double>)

	// Holds attributes of type BOOL
	bools?: {
		[string]: bool
	} @protobuf(5,type=map<sint32,bool>)

	// Holds attributes of type TIMESTAMP
	time?: {
		[string]: _time_.Time
	} @protobuf(6,type=map<sint32,google.protobuf.Timestamp>,"(gogoproto.nullable)=false","(gogoproto.stdtime)")

	// Holds attributes of type DURATION
	durations?: {
		[string]: _time_.Duration
	} @protobuf(7,type=map<sint32,google.protobuf.Duration>,"(gogoproto.nullable)=false","(gogoproto.stdduration)")

	// Holds attributes of type BYTES
	bytes?: {
		[string]: _bytes_
	} @protobuf(8,type=map<sint32,bytes>)

	// Holds attributes of type STRING_MAP
	stringMaps?: {
		[string]: #StringMap
	} @protobuf(9,type=map<sint32,StringMap>,string_maps,"(gogoproto.nullable)=false")
}
let _time_ = time
let _bytes_ = bytes

// A map of string to string. The keys and values in this map are dictionary
// indices (see the [Attributes][istio.mixer.v1.CompressedAttributes] message for an explanation)
#StringMap: {
	// Holds a set of name/value pairs.
	entries?: {
		[string]: int32
	} @protobuf(1,type=map<sint32,sint32>)
}
