// Go support for Protocol Buffers - Google's data interchange format
//
// Copyright 2015 The Go Authors.  All rights reserved.
// https://github.com/golang/protobuf
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

syntax = "proto2";

import "google/protobuf/any.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/struct.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";

package jsonpb;

// Test message for holding primitive types.
message Simple {
  optional bool o_bool = 1;
  optional int32 o_int32 = 2;
  optional int64 o_int64 = 3;
  optional uint32 o_uint32 = 4;
  optional uint64 o_uint64 = 5;
  optional sint32 o_sint32 = 6;
  optional sint64 o_sint64 = 7;
  optional float o_float = 8;
  optional double o_double = 9;
  optional string o_string = 10;
  optional bytes o_bytes = 11;
}

// Test message for holding special non-finites primitives.
message NonFinites {
    optional float f_nan = 1;
    optional float f_pinf = 2;
    optional float f_ninf = 3;
    optional double d_nan = 4;
    optional double d_pinf = 5;
    optional double d_ninf = 6;
}

// Test message for holding repeated primitives.
message Repeats {
  repeated bool r_bool = 1;
  repeated int32 r_int32 = 2;
  repeated int64 r_int64 = 3;
  repeated uint32 r_uint32 = 4;
  repeated uint64 r_uint64 = 5;
  repeated sint32 r_sint32 = 6;
  repeated sint64 r_sint64 = 7;
  repeated float r_float = 8;
  repeated double r_double = 9;
  repeated string r_string = 10;
  repeated bytes r_bytes = 11;
}

// Test message for holding enums and nested messages.
message Widget {
  enum Color {
    RED = 0;
    GREEN = 1;
    BLUE = 2;
  };
  optional Color color = 1;
  repeated Color r_color = 2;

  optional Simple simple = 10;
  repeated Simple r_simple = 11;

  optional Repeats repeats = 20;
  repeated Repeats r_repeats = 21;
}

message Maps {
  map<int64, string> m_int64_str = 1;
  map<bool, Simple> m_bool_simple = 2;
}

message MsgWithOneof {
  oneof union {
    string title = 1;
    int64 salary = 2;
    string Country = 3;
    string home_address = 4;
    MsgWithRequired msg_with_required = 5;
  }
}

message Real {
  optional double value = 1;
  extensions 100 to max;
}

extend Real {
  optional string name = 124;
}

message Complex {
  extend Real {
    optional Complex real_extension = 123;
  }
  optional double imaginary = 1;
  extensions 100 to max;
}

message KnownTypes {
  optional google.protobuf.Any an = 14;
  optional google.protobuf.Duration dur = 1;
  optional google.protobuf.Struct st = 12;
  optional google.protobuf.Timestamp ts = 2;
  optional google.protobuf.ListValue lv = 15;
  optional google.protobuf.Value val = 16;

  optional google.protobuf.DoubleValue dbl = 3;
  optional google.protobuf.FloatValue flt = 4;
  optional google.protobuf.Int64Value i64 = 5;
  optional google.protobuf.UInt64Value u64 = 6;
  optional google.protobuf.Int32Value i32 = 7;
  optional google.protobuf.UInt32Value u32 = 8;
  optional google.protobuf.BoolValue bool = 9;
  optional google.protobuf.StringValue str = 10;
  optional google.protobuf.BytesValue bytes = 11;
}

// Test messages for marshaling/unmarshaling required fields.
message MsgWithRequired {
  required string str = 1;
}

message MsgWithIndirectRequired {
  optional MsgWithRequired subm = 1;
  map<string, MsgWithRequired> map_field = 2;
  repeated MsgWithRequired slice_field = 3;
}

message MsgWithRequiredBytes {
  required bytes byts = 1;
}

message MsgWithRequiredWKT {
  required google.protobuf.StringValue str = 1;
}

extend Real {
  optional MsgWithRequired extm = 125;
}
