
// 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")
}
_time_ = time
_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>)
}
