/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * 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.
 */

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package aapt.pb;

message ConfigDescription {
	optional bytes data = 1;
	optional string product = 2;
}

message StringPool {
	optional bytes data = 1;
}

message CompiledFile {
	message Symbol {
		optional string resource_name = 1;
		optional uint32 line_no = 2;
	}

	optional string resource_name = 1;
	optional ConfigDescription config = 2;
	optional string source_path = 3;
	repeated Symbol exported_symbols = 4;
}

message ResourceTable {
	optional StringPool string_pool = 1;
	optional StringPool source_pool = 2;
	optional StringPool symbol_pool = 3;
	repeated Package packages = 4;
}

message Package {
	optional uint32 package_id = 1;
	optional string package_name = 2;
	repeated Type types = 3;
}

message Type {	
	optional uint32 id = 1;
	optional string name = 2;
	repeated Entry entries = 3;
}

message SymbolStatus {
	enum Visibility {
		Unknown = 0;
		Private = 1;
		Public = 2;
	}
	optional Visibility visibility = 1;
	optional Source source = 2;
	optional string comment = 3;
	optional bool allow_new = 4;
}

message Entry {
	optional uint32 id = 1;
	optional string name = 2;
	optional SymbolStatus symbol_status = 3;
	repeated ConfigValue config_values = 4;
}

message ConfigValue {
	optional ConfigDescription config = 1;
	optional Value value = 2;
}

message Source {
	optional uint32 path_idx = 1;
	optional uint32 line_no = 2;
	optional uint32 col_no = 3;
}

message Reference {
	enum Type {
		Ref = 0;
		Attr = 1;
	}
	optional Type type = 1;
	optional uint32 id = 2;
	optional uint32 symbol_idx = 3;
	optional bool private = 4;
}

message Id {
}

message String {
	optional uint32 idx = 1;
}

message RawString {
	optional uint32 idx = 1;
}

message FileReference {
	optional uint32 path_idx = 1;
}

message Primitive {
	optional uint32 type = 1;
	optional uint32 data = 2;
}

message Attribute {
	message Symbol {
		optional Source source = 1;
		optional string comment = 2;
		optional Reference name = 3;
		optional uint32 value = 4;
	}
	optional uint32 format_flags = 1;
	optional int32 min_int = 2;
	optional int32 max_int = 3;
	repeated Symbol symbols = 4;
}

message Style {
	message Entry {
		optional Source source = 1;
		optional string comment = 2;
		optional Reference key = 3;
		optional Item item = 4;
	}

	optional Reference parent = 1;
	optional Source parent_source = 2;
	repeated Entry entries = 3;
}

message Styleable {
	message Entry {
		optional Source source = 1;
		optional string comment = 2;
		optional Reference attr = 3;
	}
	repeated Entry entries = 1;
}

message Array {
	message Entry {
		optional Source source = 1;
		optional string comment = 2;
		optional Item item = 3;
	}
	repeated Entry entries = 1;
}

message Plural {
	enum Arity {
		Zero = 0;
		One = 1;
		Two = 2;
		Few = 3;
		Many = 4;
		Other = 5;
	}
		
	message Entry {
		optional Source source = 1;
		optional string comment = 2;
		optional Arity arity = 3;
		optional Item item = 4;
	}
	repeated Entry entries = 1;
}

message Item {
	optional Reference ref = 1;
	optional String str = 2;
	optional RawString raw_str = 3;
	optional FileReference file = 4;
	optional Id id = 5;
	optional Primitive prim = 6;
}

message CompoundValue {
	optional Attribute attr = 1;
	optional Style style = 2;
	optional Styleable styleable = 3;
	optional Array array = 4;
	optional Plural plural = 5;
}

message Value {
	optional Source source = 1;
	optional string comment = 2;
	optional bool weak = 3;
	
	optional Item item = 4;
	optional CompoundValue compound_value = 5;	
}
