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

#include <lib/fidl/cpp/message_builder.h>
#include <stdio.h>
#include <stdlib.h>

namespace fidl {

MessageBuilder::MessageBuilder(const fidl_type_t* type, uint32_t bytes_capacity,
                               uint32_t handles_capacity)
    : type_(type), buffer_(bytes_capacity, handles_capacity) {
  Reset();
}

MessageBuilder::~MessageBuilder() = default;

zx_status_t MessageBuilder::Encode(Message* message_out, const char** error_msg_out) {
  *message_out = Message(Finalize(), HandlePart(buffer_.handles(), buffer_.handles_capacity()));
  return message_out->Encode(type_, error_msg_out);
}

void MessageBuilder::Reset() {
  Builder::Reset(buffer_.bytes(), buffer_.bytes_capacity());
  New<fidl_message_header_t>();
}

}  // namespace fidl
