import "data_types_import.proto";

enum FooEnum {
    FIRST_VALUE = 1;
    SECOND_VALUE = 2;
}
    
message BarMessage {
    required int32 b_required_int32 = 1;
}

message FooMessage {
    optional int32 f_int32 = 1;
    optional int64 f_int64 = 2;
    optional uint32 f_uint32 = 3;
    optional uint64 f_uint64 = 4;
    optional sint32 f_sint32 = 5;
    optional sint64 f_sint64 = 6 [default=4];
    optional bool f_bool = 7 [default=true];
    optional FooEnum f_FooEnum = 8;
    optional fixed64 f_fixed64 = 9;
    optional sfixed64 f_sfixed64 = 10;
    optional fixed32 f_fixed32 = 11 [default=0];
    optional sfixed32 f_sfixed32 = 12;
    optional double f_double = 13;
    optional float f_float = 14;
    optional bytes f_bytes = 15;
    optional string f_string = 16;
    optional FooMessage f_self_message = 17;
    optional BarMessage f_bar_message = 18;
    repeated int32 f_repeated_int32 = 19;
    repeated int32 f_repeated_packed_int32 = 20 [ packed = true ];
    repeated float f_repeated_packed_float = 21 [ packed = true ];
    optional a.b.ImportedMessage f_imported = 22;
    optional BazMessage f_baz = 23;
    optional BazMessage.Nested f_nested = 24;
    optional BazMessage.Nested.NestedEnum f_nested_enum = 25;
    map<string, int32> f_map = 26;
    oneof test_oneof {
        int32 f1 = 27;
        bool f2 = 28;
        string f3 = 29;
    }
}

message BazMessage {
    message Nested {
        message NestedMessage {
            required int32 f_nested = 1;
        }
        enum NestedEnum {
            Foo = 0;
            Bar = 1;
            Baz = 2;
        }
        required NestedMessage f_nested = 1;
    }
    optional Nested nested = 1;
}

