// Copyright 2026 Google LLC
//
// 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
//
//    https://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.
//

edition = "2024";

package cbor_test;

import "cbor/tags.proto";
import "cbor/test/external.proto";
import "cbor/test/external_skip.proto";
import "google/protobuf/timestamp.proto";

message TestMessage {
  string name = 1 [(cbor.tags) = { name: "Name" }];
  int32 version = 2 [(cbor.tags) = { name: "Version" }];
}

message RequiredMessage {
  string required_field = 1
      [(cbor.tags) = { name: "RequiredField", is_required: true }];
}

message RequiredDisallowEmptyMessage {
  repeated string required_non_empty_list = 1 [(cbor.tags) = {
    name: "RequiredNonEmptyList",
    is_required: true,
    disallow_empty: true
  }];
}

message OptionalDisallowEmptyMessage {
  repeated string optional_non_empty_list = 1
      [(cbor.tags) = { name: "OptionalNonEmptyList", disallow_empty: true }];
}

message RequiredRepeatedMessage {
  repeated string required_repeated_field = 1
      [(cbor.tags) = { name: "RequiredRepeatedField", is_required: true }];
  repeated string not_required_repeated_field = 2
      [(cbor.tags) = { name: "NotRequiredRepeatedField" }];
}

message TypeOverrideMessage {
  bytes text_as_bytes = 1
      [(cbor.tags) = { name: "TextAsBytes", type: TYPE_TEXT_STRING }];
  string bytes_as_text = 2
      [(cbor.tags) = { name: "BytesAsText", type: TYPE_BYTE_STRING }];
  int32 uint_as_int = 3 [(cbor.tags) = { name: "UintAsInt", type: TYPE_UINT }];
}

message NestedMessage {
  string value = 1 [(cbor.tags) = { name: "Value" }];
}

message ComplexMessage {
  int32 int32_field = 1 [(cbor.tags) = { name: "Int32Field" }];
  int64 int64_field = 2 [(cbor.tags) = { name: "Int64Field" }];
  uint32 uint32_field = 3 [(cbor.tags) = { name: "Uint32Field" }];
  uint64 uint64_field = 4 [(cbor.tags) = { name: "Uint64Field" }];
  string string_field = 5 [(cbor.tags) = { name: "StringField" }];
  bytes bytes_field = 6 [(cbor.tags) = { name: "BytesField" }];
  bool bool_field = 7 [(cbor.tags) = { name: "BoolField" }];
  float float_field = 8 [(cbor.tags) = { name: "FloatField" }];
  double double_field = 9 [(cbor.tags) = { name: "DoubleField" }];

  repeated int32 repeated_int32 = 10 [(cbor.tags) = { name: "RepeatedInt32" }];
  repeated string repeated_string = 11
      [(cbor.tags) = { name: "RepeatedString" }];

  NestedMessage nested = 12 [(cbor.tags) = { name: "Nested" }];
  repeated NestedMessage repeated_nested = 13
      [(cbor.tags) = { name: "RepeatedNested" }];

  repeated bytes repeated_bytes = 20 [(cbor.tags) = { name: "RepeatedBytes" }];
  repeated string repeated_string_array = 21
      [(cbor.tags) = { name: "RepeatedStringArray" }];
  repeated int64 repeated_int64 = 22 [(cbor.tags) = { name: "RepeatedInt64" }];
  repeated uint32 repeated_uint32 = 23
      [(cbor.tags) = { name: "RepeatedUint32" }];
  repeated uint64 repeated_uint64 = 24
      [(cbor.tags) = { name: "RepeatedUint64" }];
  repeated bool repeated_bool = 25 [(cbor.tags) = { name: "RepeatedBool" }];
  repeated float repeated_float = 26 [(cbor.tags) = { name: "RepeatedFloat" }];
  repeated double repeated_double = 27
      [(cbor.tags) = { name: "RepeatedDouble" }];

  string read_only_field = 14
      [(cbor.tags) = { name: "ReadOnly", mode: MODE_READ_ONLY }];
  string write_only_field = 15
      [(cbor.tags) = { name: "WriteOnly", mode: MODE_WRITE_ONLY }];
  string skip_field = 16 [(cbor.tags) = { mode: MODE_SKIP }];
  ExternalMessage external_field = 17 [(cbor.tags) = { name: "ExternalField" }];
  ExternalSkipMessage skip_external_field = 18
      [(cbor.tags) = { mode: MODE_SKIP }];
  google.protobuf.Timestamp timestamp_field = 19
      [(cbor.tags) = { mode: MODE_SKIP }];
}
