/* Test nanopb option parsing.
 * options.expected lists the patterns that are searched for in the output.
 */

syntax = "proto2";

import "nanopb.proto";

// File level options
option (nanopb_fileopt).max_size = 20;

message Message1
{
    required string filesize = 1;
}

// Message level options
message Message2
{
    option (nanopb_msgopt).max_size = 30;
    required string msgsize = 1;
}

// Field level options
message Message3
{
    option (nanopb_msgopt).msgid = 103;
    required string fieldsize = 1 [(nanopb).max_size = 40];
    required string fieldlen = 2 [(nanopb).max_length = 40];
}

// Forced callback field
message Message4
{
    option (nanopb_msgopt).msgid = 104;
    required int32 int32_callback = 1 [(nanopb).type = FT_CALLBACK];
}

// Short enum names
enum Enum1
{
    option (nanopb_enumopt).long_names = false;
    EnumValue1 = 1;
    EnumValue2 = 2;
}

message EnumTest
{
    required Enum1 field = 1 [default = EnumValue2];
}

// Short enum names inside message
message Message5
{
    option (nanopb_msgopt).msgid = 105;
    enum Enum2
    {
       option (nanopb_enumopt).long_names = false;
       EnumValue1 = 1;
    }
    required Enum2 field = 1 [default = EnumValue1];
}

// Packed structure
message my_packed_struct
{
    option (nanopb_msgopt).packed_struct = true;
    optional int32 myfield = 1;
}

// Message with ignored field
message Message6
{
    required int32 field1 = 1;
    optional int32 skipped_field = 2 [(nanopb).type = FT_IGNORE];
}

// Message that is skipped
message SkippedMessage
{
    option (nanopb_msgopt).skip_message = true;
    required int32 foo = 1;
}

// Message with oneof field
message OneofMessage
{
    oneof foo {
        int32 bar = 1;
    }
}

// Proto3-style optional field in proto2 file
message Proto3Field
{
    optional int32 proto3field = 1 [(nanopb).proto3 = true];
}

// Wide descriptors
message WideMessage
{
    option (nanopb_msgopt).descriptorsize = DS_4;
    required int32 foo = 1;
}

// Wide descriptor option in a single field
message WideMessage2
{
    required int32 foo = 1 [(nanopb).descriptorsize = DS_8];
    required int32 foo2 = 2 [(nanopb).descriptorsize = DS_4];
    required int32 foo3 = 3;
}

// Default value for has_ field
message HasFieldMessage
{
    optional int32 present = 1 [(nanopb).default_has = true];
    optional int32 missing = 2 [(nanopb).default_has = false];
    optional int32 normal = 3;
}

// Overridden type in generated C code
message TypeOverrideMessage
{
    required Enum1 normal = 1;
    required Enum1 overridden = 2 [(nanopb).type_override = TYPE_UINT32];
}
