#ifndef NIX_IRC_SERIALIZER_H
#define NIX_IRC_SERIALIZER_H

#include "types.h"
#include <fstream>
#include <string>
#include <vector>

namespace nix_irc {

class Serializer {
public:
  Serializer();
  ~Serializer();

  void serialize(const IRModule& module, const std::string& path);
  std::vector<uint8_t> serialize_to_bytes(const IRModule& module);

private:
  struct Impl;
  std::unique_ptr<Impl> pImpl;
};

class Deserializer {
public:
  Deserializer();
  ~Deserializer();

  IRModule deserialize(const std::string& path);
  IRModule deserialize(const std::vector<uint8_t>& data);

private:
  struct Impl;
  std::unique_ptr<Impl> pImpl;
};

} // namespace nix_irc

#endif