#include "DBusVariantHelper.hpp" #include #include //std::ostream &operator<<(std::ostream &s, const std::map &properties) std::ostream&operator<<(std::ostream&s, const sdbus::Variant&v) { // clang-format off #define HANDLE_VARIANT_TYPE(type) \ if (v.containsValueOfType()) \ { \ s << v.get(); \ } HANDLE_VARIANT_TYPE(std::string) else if (v.containsValueOfType()) { uint8_t value = v.get(); s << (int)value; } else HANDLE_VARIANT_TYPE(uint32_t) else HANDLE_VARIANT_TYPE(int32_t) else HANDLE_VARIANT_TYPE(uint64_t) else HANDLE_VARIANT_TYPE(int64_t) else HANDLE_VARIANT_TYPE(uint16_t) else HANDLE_VARIANT_TYPE(int16_t) else HANDLE_VARIANT_TYPE(bool) else HANDLE_VARIANT_TYPE(sdbus::Variant) else if (v.containsValueOfType()) { auto objectPath = v.get(); s << '[' << objectPath.c_str() << ']'; } else if (v.containsValueOfType>()) { auto values = v.get>(); { s << '['; bool first = true; for (const sdbus::ObjectPath&value: values) { if (!first) s << ", "; first = false; s << value.c_str(); } s << ']'; } } else if (v.containsValueOfType>()) { auto paths = v.get >(); { s << '['; bool first = true; for (const sdbus::ObjectPath&path: paths) { if (!first) s << ", "; first = false; s << path.c_str(); } s << ']'; } } else if (v.containsValueOfType>()) { std::vector bytes = v.get>(); s << '['; bool first = true; for (uint8_t byte: bytes) { if (!first) s << ", "; first = false; s << (int)byte; } s << ']'; } else if (v.containsValueOfType>>()) { auto arrayOfArrays = v.get>>(); s << '['; bool first = true; for (const auto& array: arrayOfArrays) { if (!first) s << ", "; first = false; bool first2 = true; for (auto byte: array) { if (!first2) s << ", "; first2 = false; s << byte; } } s << ']'; } else if (v.containsValueOfType>()) { std::map map = v.get>(); s << "{"; bool first = true; for (const auto &[key, value]: map) { if (!first) s << ","; first = false; s << '\"' << key << "\": " << value; } s << "}"; } else if (v.containsValueOfType>>()) { std::map> values = v.get>>(); s << '{'; bool first = true; for (const auto &[key,bytes]: values) { if (!first) s << ','; first = false; s << "{\"" << key << "\": ["; bool first2 = true; for (auto b : bytes) { if (!first2) s << ','; first2 = false; s << b; } s << "]"; } s << '}'; } // else HANDLE_VARIANT_TYPE(float) // else HANDLE_VARIANT_TYPE(double) // else HANDLE_VARIANT_TYPE(uint64_t) // else HANDLE_VARIANT_TYPE(int64_t) // else HANDLE_VARIANT_TYPE(char) // else HANDLE_VARIANT_TYPE(uint8_t) // else HANDLE_VARIANT_TYPE(int8_t) else { s << "UNKNOWN VALUE OF TYPE " << v.peekValueType(); } #undef HANDLE_VARIANT_TYPE // clang-format on return s; } std::ostream&operator<<(std::ostream&s,const std::map& properties) { s << "{"; bool first = true; for (const auto &property : properties) { if (!first) { s << ", "; } first = false; s << '"' << property.first << "\": "; const sdbus::Variant &v = property.second; s << v; } s << "}"; return s; }