// Protocol Buffers - Google's data interchange format
// Copyright 2023 Google LLC.  All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

syntax = "proto2";

package nest;

message Outer {
  message Inner {
    message InnerSubMsg {
      optional bool flag = 1;
    }

    enum InnerEnum {
      INNER_ENUM_UNSPECIFIED = 0;
      INNER_ENUM_FOO = 1;
    }

    optional double double = 1;
    optional float float = 2;
    optional int32 int32 = 3;
    optional int64 int64 = 4;
    optional uint32 uint32 = 5;
    optional uint64 uint64 = 6;
    optional sint32 sint32 = 7;
    optional sint64 sint64 = 8;
    optional fixed32 fixed32 = 9;
    optional fixed64 fixed64 = 10;
    optional sfixed32 sfixed32 = 11;
    optional sfixed64 sfixed64 = 12;
    optional bool bool = 13;
    optional string string = 14;
    optional bytes bytes = 15;
    optional InnerSubMsg inner_submsg = 16;
    optional InnerEnum inner_enum = 17;
    repeated int32 repeated_int32 = 18 [packed = true];
    repeated InnerSubMsg repeated_inner_submsg = 19;
    map<string, string> string_map = 20;

    message SuperInner {
      message DuperInner {
        message EvenMoreInner {
          message CantBelieveItsSoInner {
            optional int32 num = 99;
          }

          enum JustWayTooInner {
            JUST_WAY_TOO_INNER_UNSPECIFIED = 0;
          }
        }
      }
    }
  }
  optional Inner inner = 1;
  optional .nest.Outer.Inner.SuperInner.DuperInner.EvenMoreInner
      .CantBelieveItsSoInner deep = 2;

  optional .nest.Outer.Inner.SuperInner.DuperInner.EvenMoreInner.JustWayTooInner
      deep_enum = 4;

  optional NotInside notinside = 3;
}

message NotInside {
  optional int32 num = 1;
}

message Recursive {
  optional Recursive rec = 1;
  optional int32 num = 2;
}