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

#ifndef SRC_EMBEDDER_STANDARD_MESSAGE_CODEC_MESSAGE_CODEC_H_
#define SRC_EMBEDDER_STANDARD_MESSAGE_CODEC_MESSAGE_CODEC_H_

#include <memory>
#include <string>
#include <vector>

namespace standard_message_codec {

// Translates between a binary message and higher-level method call and
// response/error objects.
template <typename T>
class MessageCodec {
 public:
  MessageCodec() = default;

  virtual ~MessageCodec() = default;

  // Prevent copying.
  MessageCodec(MessageCodec<T> const&) = delete;
  MessageCodec& operator=(MessageCodec<T> const&) = delete;

  // Returns the message encoded in |binary_message|, or nullptr if it cannot be
  // decoded by this codec.
  std::unique_ptr<T> DecodeMessage(const uint8_t* binary_message, const size_t message_size) const {
    return std::move(DecodeMessageInternal(binary_message, message_size));
  }

  // Returns the message encoded in |binary_message|, or nullptr if it cannot be
  // decoded by this codec.
  std::unique_ptr<T> DecodeMessage(const std::vector<uint8_t>& binary_message) const {
    size_t size = binary_message.size();
    const uint8_t* data = size > 0 ? &binary_message[0] : nullptr;
    return std::move(DecodeMessageInternal(data, size));
  }

  // Returns a binary encoding of the given |message|, or nullptr if the
  // message cannot be serialized by this codec.
  std::unique_ptr<std::vector<uint8_t>> EncodeMessage(const T& message) const {
    return std::move(EncodeMessageInternal(message));
  }

 protected:
  // Implementation of the public interface, to be provided by subclasses.
  virtual std::unique_ptr<T> DecodeMessageInternal(const uint8_t* binary_message,
                                                   const size_t message_size) const = 0;

  // Implementation of the public interface, to be provided by subclasses.
  virtual std::unique_ptr<std::vector<uint8_t>> EncodeMessageInternal(const T& message) const = 0;
};

}  // namespace standard_message_codec

#endif  // SRC_EMBEDDER_STANDARD_MESSAGE_CODEC_MESSAGE_CODEC_H_
