// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

syntax = "proto2";

package testretention;

import "cmd/protoc-gen-go/testdata/retention/options_message.proto";
import "google/protobuf/descriptor.proto";

option go_package = "google.golang.org/protobuf/cmd/protoc-gen-go/testdata/retention";
option (imported_plain_option) = 1;
option (imported_runtime_retention_option) = 2;
option (imported_source_retention_option) = 3;

// Retention attributes set directly on custom options
extend google.protobuf.FileOptions {
  optional int32 plain_option = 505092806;
  optional int32 runtime_retention_option = 505039132
      [retention = RETENTION_RUNTIME];
  optional int32 source_retention_option = 504878676
      [retention = RETENTION_SOURCE];
}

option (plain_option) = 1;
option (runtime_retention_option) = 2;
option (source_retention_option) = 3;

option (file_option) = {
  plain_field: 1
  runtime_retention_field: 2
  source_retention_field: 3
};

// Retention attribute nested inside a repeated message field
extend google.protobuf.FileOptions {
  repeated OptionsMessage repeated_options = 504823570;
}

option (repeated_options) = {
  plain_field: 1
  runtime_retention_field: 2
  source_retention_field: 3
};

extend google.protobuf.ExtensionRangeOptions {
  optional OptionsMessage extension_range_option = 504822148;
}

extend google.protobuf.MessageOptions {
  optional OptionsMessage message_option = 504820819;
}

extend google.protobuf.FieldOptions {
  optional OptionsMessage field_option = 504589219;
}

extend google.protobuf.OneofOptions {
  optional OptionsMessage oneof_option = 504479153;
}

extend google.protobuf.EnumOptions {
  optional OptionsMessage enum_option = 504451567;
}

extend google.protobuf.EnumValueOptions {
  optional OptionsMessage enum_entry_option = 504450522;
}

extend google.protobuf.ServiceOptions {
  optional OptionsMessage service_option = 504387709;
}

extend google.protobuf.MethodOptions {
  optional OptionsMessage method_option = 504349420;
}

message Extendee {
  extensions 1, 2;
}

extend Extendee {
  optional int32 i = 1 [(field_option) = {
    plain_field: 1
    runtime_retention_field: 2
    source_retention_field: 3
  }];
}

message TopLevelMessage {
  option (message_option) = {
    plain_field: 1
    runtime_retention_field: 2
    source_retention_field: 3
  };

  message NestedMessage {
    option (message_option) = {
      plain_field: 1
      runtime_retention_field: 2
      source_retention_field: 3
    };
  }

  enum NestedEnum {
    option (enum_option) = {
      plain_field: 1
      runtime_retention_field: 2
      source_retention_field: 3
    };

    NESTED_UNKNOWN = 0;
  }

  optional float f = 1 [(field_option) = {
    plain_field: 1
    runtime_retention_field: 2
    source_retention_field: 3
  }];

  oneof o {
    option (oneof_option) = {
      plain_field: 1
      runtime_retention_field: 2
      source_retention_field: 3
    };

    int64 i = 2;
  }

  extensions 10 to 100 [(extension_range_option) = {
    plain_field: 1
    runtime_retention_field: 2
    source_retention_field: 3
  }];

  extend Extendee {
    optional string s = 2 [(field_option) = {
      plain_field: 1
      runtime_retention_field: 2
      source_retention_field: 3
    }];
  }
}

enum TopLevelEnum {
  option (enum_option) = {
    plain_field: 1
    runtime_retention_field: 2
    source_retention_field: 3
  };

  TOP_LEVEL_UNKNOWN = 0 [(enum_entry_option) = {
    plain_field: 1
    runtime_retention_field: 2
    source_retention_field: 3
  }];
}

service Service {
  option (service_option) = {
    plain_field: 1
    runtime_retention_field: 2
    source_retention_field: 3
  };

  rpc DoStuff(TopLevelMessage) returns (TopLevelMessage) {
    option (method_option) = {
      plain_field: 1
      runtime_retention_field: 2
      source_retention_field: 3
    };
  }
}
