// Copyright 2019 The Pigweed Authors
//
// 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.
syntax = "proto3";

// This is a test .proto file for pw_protobuf's codegen implementation.

package pw.protobuf.test;

// Top-level enum definition.
enum Bool {
  TRUE = 0;
  FALSE = 1;
  FILE_NOT_FOUND = 2;
}

// A message!
message Pigweed {
  // Nested messages and enums.
  message Pigweed {
    enum Binary {
      ZERO = 0;
      ONE = 1;
    };

    Bool status = 1;
  }

  message Protobuf {
    enum Binary {
      ONE = 0;
      ZERO = 1;
    };

    // We must go deeper.
    message Compiler {
      enum Status {
        OK = 0;
        ERROR = 1;
        FUBAR = 2;
      }

      string file_name = 1;
      Status status = 2;
      Binary protobuf_bin = 3;
      Pigweed.Binary pigweed_bin = 4;
    }

    Binary binary_value = 1;
  }

  // Regular types.
  uint32 magic_number = 1;
  sint32 ziggy = 2;
  fixed64 cycles = 3;
  float ratio = 4;
  string error_message = 5;

  DeviceInfo device_info = 6;

  // Nested messages and enums as fields.
  Pigweed pigweed = 7;
  Protobuf.Binary bin = 8;

  Proto proto = 9;
  repeated Proto.ID id = 10;
}

// Another message.
message Proto {
  enum Binary {
    OFF = 0;
    ON = 1;
  };

  message ID {
    uint32 id = 1;
  }

  // Circular dependency with Pigweed.
  Pigweed pigweed = 1;

  // Same name, different namespace.
  Binary bin = 2;
  Pigweed.Pigweed.Binary pigweed_pigweed_bin = 3;
  Pigweed.Protobuf.Binary pigweed_protobuf_bin = 4;

  Pigweed.Protobuf.Compiler meta = 5;
}

// Yet another message.
message DeviceInfo {
  enum DeviceStatus {
    OK = 0;
    ASSERT = 1;
    FAULT = 2;
    PANIC = 3;
  }

  string device_name = 1;
  fixed32 device_id = 2;
  DeviceStatus status = 3;

  repeated KeyValuePair attributes = 4;
}

// This might be useful.
message KeyValuePair {
  string key = 1;
  string value = 2;
}
