}
}
#include "rec-web-stubs.hh"
-
namespace pdns::rust::web::rec
{
-NetmaskGroup::NetmaskGroup(const ::NetmaskGroup& arg) :
- d_ptr(std::make_unique<::NetmaskGroup>(arg))
+
+template <typename M>
+Wrapper<M>::Wrapper(const M& arg) :
+ d_ptr(std::make_unique<M>(arg))
{
}
-NetmaskGroup::~NetmaskGroup() = default;
+template <typename M>
+Wrapper<M>::~Wrapper<M>() = default;
-ComboAddress::ComboAddress(const ::ComboAddress& arg) :
- d_ptr(std::make_unique<::ComboAddress>(arg))
+template <typename M>
+[[nodiscard]] const M& Wrapper<M>::get() const
{
+ return *d_ptr;
}
-ComboAddress::~ComboAddress() = default;
+
+template class Wrapper<::NetmaskGroup>;
+template class Wrapper<::ComboAddress>;
std::unique_ptr<ComboAddress> comboaddress(::rust::Str str)
{
return std::make_unique<ComboAddress>(::ComboAddress(std::string(str)));
}
-[[nodiscard]] const ::NetmaskGroup& NetmaskGroup::get() const
-{
- return *d_ptr;
-}
-
-[[nodiscard]] const ::ComboAddress& ComboAddress::get() const
-{
- return *d_ptr;
-}
-
bool matches(const std::unique_ptr<NetmaskGroup>& nmg, const std::unique_ptr<ComboAddress>& address)
{
return nmg->get().match(address->get());
namespace pdns::rust::web::rec
{
using CredentialsHolder = ::CredentialsHolder;
- //using NetmaskGroup = ::NetmaskGroup;
+// using NetmaskGroup = ::NetmaskGroup;
struct KeyValue;
struct Request;
struct Response;
-class NetmaskGroup
-{
-public:
- NetmaskGroup(const ::NetmaskGroup& arg);
- ~NetmaskGroup();
- [[nodiscard]] const ::NetmaskGroup& get() const;
-private:
- std::unique_ptr<::NetmaskGroup> d_ptr;
-};
-class ComboAddress
+
+template <typename A>
+class Wrapper
{
public:
- ComboAddress(const ::ComboAddress& arg);
- ~ComboAddress();
- [[nodiscard]] const ::ComboAddress& get() const;
+ Wrapper(const A& arg);
+ ~Wrapper(); // out-of-line definition, to keep A opaque
+
+ Wrapper() = delete;
+ Wrapper(const Wrapper&) = delete;
+ Wrapper(Wrapper&&) = delete;
+ Wrapper& operator=(const Wrapper&) = delete;
+ Wrapper& operator=(Wrapper&&) = delete;
+
+ [[nodiscard]] const A& get() const;
+
private:
- std::unique_ptr<::ComboAddress> d_ptr;
+ std::unique_ptr<A> d_ptr;
};
+using NetmaskGroup = Wrapper<::NetmaskGroup>;
+using ComboAddress = Wrapper<::ComboAddress>;
void apiServer(const Request& rustRequest, Response& rustResponse);
void apiDiscovery(const Request& rustRequest, Response& rustResponse);
void apiServerZoneDetailGET(const Request& rustRequest, Response& rustResponse);
void apiServerZoneDetailPUT(const Request& rustRequest, Response& rustResponse);
void apiServerZoneDetailDELETE(const Request& rustRequest, Response& rustResponse);
-std::unique_ptr<pdns::rust::web::rec::ComboAddress> comboaddress(::rust::Str str);
+std::unique_ptr<ComboAddress> comboaddress(::rust::Str str);
bool matches(const std::unique_ptr<NetmaskGroup>& nmg, const std::unique_ptr<ComboAddress>& address);
}
use shared libs (in theory, I did not try). Currently all CXX using Rust cargo's must be compiled
as one and refer to a single static Rust runtime
- Ripping out yahttp stuff, providing some basic classees only
+- Some classes (NetmaskGroup, ComboAddress) need a uniqueptr Wrapper to keep them opaque (iputils
+ cannot be included without big headages in bridge.hh at the moment). We could seperate
+ NetmaskGroup, but I expect ComboAddress to not work as it is union.
*/
use std::net::SocketAddr;
auto lock1 = g_initialAllowFrom.lock();
auto lock2 = g_initialAllowNotifyFrom.lock();
if (*lock1 && aclType == "allow-from") {
- entries = (*lock1)->toStringVector();
+ entries = (*lock1)->toStringVector();
}
else if (*lock2 && aclType == "allow-notify-from") {
entries = (*lock2)->toStringVector();
yarl.initialize(&req);
socket->setNonBlocking();
- const struct timeval timeout{
- g_networkTimeoutMsec / 1000, static_cast<suseconds_t>(g_networkTimeoutMsec) % 1000 * 1000};
+ const struct timeval timeout
+ {
+ g_networkTimeoutMsec / 1000, static_cast<suseconds_t>(g_networkTimeoutMsec) % 1000 * 1000
+ };
std::shared_ptr<TLSCtx> tlsCtx{nullptr};
if (d_loglevel > WebServer::LogLevel::None) {
socket->getRemote(remote);
response.body = e.response().body;
response.status = e.response().status;
}
- catch (const ApiException & e) {
+ catch (const ApiException& e) {
response.setErrorResult(e.what(), 422);
}
- catch (const JsonException & e) {
+ catch (const JsonException& e) {
response.setErrorResult(e.what(), 422);
}
fromCxxToRust(response, rustResponse);