71 lines
1.9 KiB
C++
71 lines
1.9 KiB
C++
@use itertools::Itertools;
|
|
@use crate::data::RPC;
|
|
@use crate::generators::cpp_s::*;
|
|
|
|
@(rpc: &RPC)
|
|
#pragma once
|
|
#ifndef MRPC_GEN_H
|
|
#define MRPC_GEN_H
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
#include <optional>
|
|
#include <cstdint>
|
|
#include <cmath>
|
|
#include <corvusoft/restbed/byte.hpp>
|
|
#define RAPIDJSON_HAS_STDSTRING 1
|
|
#include <rapidjson/stringbuffer.h>
|
|
#include <rapidjson/writer.h>
|
|
#include <rapidjson/document.h>
|
|
|
|
namespace restbed @{
|
|
class Resource;
|
|
class Session;
|
|
@}
|
|
|
|
namespace mrpc @{
|
|
using MRPCJWriter = rapidjson::Writer<rapidjson::StringBuffer>;
|
|
@for e in &rpc.enums {
|
|
enum struct @e.name : std::uint64_t @{
|
|
@e.values.iter().map(|(k,v)| format!("{k} = {v}")).join(",\n ")
|
|
@};
|
|
}
|
|
@for s in &rpc.structs {@get_struct_generics(s)struct @s.name;
|
|
}
|
|
@for s in &rpc.structs {
|
|
@get_struct_generics(s)struct @s.name @{
|
|
@for f in &s.fields { @ty_to_str(&f.ty) @f.name;
|
|
}
|
|
MRPCJWriter& operator >>(MRPCJWriter&) const;
|
|
@(s.name)& operator <<(const rapidjson::Value&);
|
|
@};}
|
|
@if streams_required(rpc).len() > 0 {
|
|
struct MRPCStreamImpl @{
|
|
void close() const noexcept;
|
|
bool is_open() const noexcept;
|
|
protected:
|
|
explicit MRPCStreamImpl(const std::shared_ptr<restbed::Session> &conn);
|
|
std::shared_ptr<restbed::Session> conn;
|
|
@};
|
|
|
|
template<typename T>
|
|
struct MRPCStream final : MRPCStreamImpl @{
|
|
explicit MRPCStream(const std::shared_ptr<restbed::Session> &conn) : MRPCStreamImpl(conn) @{@}
|
|
void send(const T &v) const noexcept;
|
|
@};
|
|
|
|
@for s in streams_required(rpc) {template struct MRPCStream<@(s)>;
|
|
}}
|
|
struct MRPCServer @{
|
|
MRPCServer() = delete;
|
|
explicit MRPCServer(std::shared_ptr<restbed::Resource>&);
|
|
private:
|
|
@for s in &rpc.services {@for m in &s.methods { virtual @method_ret(m) @(s.name)_@(m.name)(@method_args(m)) = 0;
|
|
}}
|
|
virtual void msg_handler(std::shared_ptr<restbed::Session>, const restbed::Bytes&) final;
|
|
@};
|
|
@}
|
|
|
|
#endif // MRPC_GEN_H
|