// Generated file - DO NOT MODIFY
#pragma once

#include <glacier/buffer/byte_buffer.h>
#include <glacier/buffer/cap_buffer.h>
#include <glacier/status/status.h>
#include <glacier/container/vector.h>
#include <glacier/string/string.h>
#include <yunq/message_view.h>
#include <yunq/serialize.h>
#include <ztypes.h>

{% if package != None %}
namespace {{package.cpp_namespace()}} {
{% endif %}

{%- for message in messages %}
class {{message.name}} {
 public:
  {{message.name}}() {}
  // Delete copy and move until implemented.
  {{message.name}}(const {{message.name}}&) = delete;
  {{message.name}}({{message.name}}&&) = default;
  {{message.name}}& operator=({{message.name}}&&) = default;

  [[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message);
  [[nodiscard]] glcr::Status ParseFromBytes(const yunq::MessageView& message, const glcr::CapBuffer&);
  uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset) const;
  uint64_t SerializeToBytes(glcr::ByteBuffer&, uint64_t offset, glcr::CapBuffer&) const;

{%- for field in message.fields %}
  {%- if not field.repeated %} 

  const {{field.cpp_type()}}& {{field.name}}() const { return {{field.name}}_; }
  {{field.cpp_type()}}& mutable_{{field.name}}() { return {{field.name}}_; }

  {%- if field.type != Type.MESSAGE %}
  void set_{{field.name}}(const {{field.cpp_type()}}& value) { {{field.name}}_ = value; }
  {%- endif %}

  {%- else %}

  const glcr::Vector<{{field.cpp_type()}}>& {{field.name}}() const { return {{field.name}}_; }
  glcr::Vector<{{field.cpp_type()}}>& mutable_{{field.name}}() { return {{field.name}}_; }
  
  {%- if field.type != Type.MESSAGE %}
  void add_{{field.name}}(const {{field.cpp_type()}}& value) { {{field.name}}_.PushBack(value); }
  {%- endif %}
  void add_{{field.name}}({{field.cpp_type()}}&& value) { {{field.name}}_.PushBack(glcr::Move(value)); }

  {%- endif %}
{%- endfor %}

 private:
{%- for field in message.fields %}
  {%- if not field.repeated %}
  {{field.cpp_type()}} {{field.name}}_;
  {%- else %}
  glcr::Vector<{{field.cpp_type()}}> {{field.name}}_;
  {%- endif %}
{%- endfor %}

  // Parses everything except for caps.
  glcr::Status ParseFromBytesInternal(const yunq::MessageView& message);

  uint64_t SerializeInternal(yunq::Serializer& serializer) const;
};
{%- endfor %}

{% if package != None %}
}  // namepace {{package.cpp_namespace()}}
{% endif %}