virthttp  0.0
libvirt http interface
virt2json.hpp
Go to the documentation of this file.
1 #pragma once
2 #include <libvirt/libvirt.h>
3 #include <rapidjson/pointer.h>
5 
6 template <class JAllocator> auto to_json(const virt::TypedParams& tp, JAllocator&& jalloc) noexcept -> rapidjson::Value {
7  rapidjson::Value ret;
8  for (const virt::TypedParams::Element& v : tp) {
9  switch (v.type()) {
10  case VIR_TYPED_PARAM_INT:
11  ret.AddMember(rapidjson::Value(v.name(), jalloc), rapidjson::Value(v.value().i), jalloc);
12  break;
13  case VIR_TYPED_PARAM_UINT:
14  ret.AddMember(rapidjson::Value(v.name(), jalloc), rapidjson::Value(v.value().ui), jalloc);
15  break;
16  case VIR_TYPED_PARAM_LLONG:
17  ret.AddMember(rapidjson::Value(v.name(), jalloc), rapidjson::Value(int64_t{v.value().l}), jalloc);
18  break;
19  case VIR_TYPED_PARAM_ULLONG:
20  ret.AddMember(rapidjson::Value(v.name(), jalloc), rapidjson::Value(uint64_t{v.value().ul}), jalloc);
21  break;
22  case VIR_TYPED_PARAM_DOUBLE:
23  ret.AddMember(rapidjson::Value(v.name(), jalloc), rapidjson::Value(v.value().d), jalloc);
24  break;
25  case VIR_TYPED_PARAM_BOOLEAN:
26  ret.AddMember(rapidjson::Value(v.name(), jalloc), rapidjson::Value(v.value().b), jalloc);
27  break;
28  case VIR_TYPED_PARAM_STRING:
29  ret.AddMember(rapidjson::Value(v.name(), jalloc), rapidjson::Value(v.value().s, jalloc), jalloc);
30  break;
31  default:
33  }
34  }
35  return ret;
36 }
37 
38 template <class JAllocator> auto to_json(const char* cstr, JAllocator&& jalloc) -> rapidjson::Value { return {cstr, jalloc}; }
39 
40 template <class JAllocator> auto to_json(UniqueZstring zstr, JAllocator&& jalloc) -> rapidjson::Value {
41  return to_json(static_cast<const char*>(zstr), std::forward<JAllocator>(jalloc));
42 }
43 
44 using VirtWrappedDomainTime = decltype(*std::declval<virt::Domain>().getTime());
45 
46 template <class JAllocator> auto to_json(VirtWrappedDomainTime time, JAllocator&& jalloc) -> rapidjson::Value {
47  rapidjson::Value ret{};
48  ret.SetObject();
49  ret.AddMember("seconds", static_cast<int64_t>(time.seconds), jalloc);
50  ret.AddMember("nanosec", static_cast<unsigned>(time.nanosec), jalloc);
51  return std::move(ret);
52 }
53 
54 template <class JAllocator> auto to_json(virNetworkDHCPLease lease, JAllocator&& jalloc) -> rapidjson::Value {
55  rapidjson::Value json_lease;
56  json_lease.AddMember("type", lease.type, jalloc);
57  json_lease.AddMember("client-id", to_json(lease.clientid, jalloc), jalloc);
58  json_lease.AddMember("expiry-time", static_cast<std::int64_t>(lease.expirytime), jalloc);
59  json_lease.AddMember("hostname", to_json(lease.hostname, jalloc), jalloc);
60  json_lease.AddMember("iaid", to_json(lease.iaid, jalloc), jalloc);
61  json_lease.AddMember("interface", to_json(lease.iface, jalloc), jalloc);
62  json_lease.AddMember("ip-address", to_json(lease.ipaddr, jalloc), jalloc);
63  json_lease.AddMember("mac-address", to_json(lease.mac, jalloc), jalloc);
64  json_lease.AddMember("prefix", lease.prefix, jalloc);
65  return json_lease;
66 }
67 
68 auto to_json(TFE tfe) -> rapidjson::Value {
69  assert(!tfe.err());
70  rapidjson::Value v;
71  v.SetBool(static_cast<bool>(tfe));
72  return v;
73 }
74 
75 template <class T, class JAllocator> auto to_json(std::vector<T> vec, JAllocator&& jalloc) -> rapidjson::Value {
76  rapidjson::Value arr;
77  arr.SetArray();
78  for (auto&& element : std::move(vec))
79  arr.PushBack(to_json(std::move(element), jalloc), jalloc);
80  return std::move(arr);
81 }
82 
83 template <class T, class JAllocator> auto get_to_json(std::optional<T> opt, JAllocator&& jalloc) -> rapidjson::Value {
84  return to_json(std::move(*opt), std::forward<JAllocator>(jalloc));
85 }
Definition: TypesParam.hpp:29
#define UNREACHABLE
Definition: utility.hpp:19
auto to_json(const virt::TypedParams &tp, JAllocator &&jalloc) noexcept-> rapidjson::Value
Definition: virt2json.hpp:6
TypePair< T, U > tp
Definition: utils.hpp:19
auto get_to_json(std::optional< T > opt, JAllocator &&jalloc) -> rapidjson::Value
Definition: virt2json.hpp:83
decltype(*std::declval< virt::Domain >().getTime()) VirtWrappedDomainTime
Definition: virt2json.hpp:44
Definition: utility.hpp:122
Definition: TypesParam.hpp:38
Definition: tfe.hpp:4