From 86b620ec79190f874faa9343583077a8440bee61 Mon Sep 17 00:00:00 2001 From: Simon Gene Gottlieb Date: Mon, 2 Dec 2024 13:34:19 +0100 Subject: [PATCH] feat: improved support of fields of type 'any' Currently, types of 'any' are simply ignored when generating output. This improves the handling of 'any' by adding explicit conversions to: - float - double - char - int8_t - uint8_t - int16_t - uint16_t - int32_t - uint32_t - int64_t - uint64_t and - std::string required to fix https://github.com/deNBI-cibi/tool_description_lib/issues/59 --- schema_salad/cpp_codegen.py | 57 +++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 18 deletions(-) diff --git a/schema_salad/cpp_codegen.py b/schema_salad/cpp_codegen.py index d010588a..3593baa8 100644 --- a/schema_salad/cpp_codegen.py +++ b/schema_salad/cpp_codegen.py @@ -700,24 +700,18 @@ def epilogue(self, root_loader: Optional[TypeDef]) -> None: } // declaring toYaml -inline auto toYaml(bool v) { - return YAML::Node{v}; -} -inline auto toYaml(float v) { - return YAML::Node{v}; -} -inline auto toYaml(double v) { - return YAML::Node{v}; -} -inline auto toYaml(int32_t v) { - return YAML::Node{v}; -} -inline auto toYaml(int64_t v) { - return YAML::Node{v}; -} -inline auto toYaml(std::any const&) { - return YAML::Node{}; -} +inline auto toYaml(bool v) { return YAML::Node{v}; } +inline auto toYaml(float v) { return YAML::Node{v}; } +inline auto toYaml(double v) { return YAML::Node{v}; } +inline auto toYaml(char v) { return YAML::Node{v}; } +inline auto toYaml(int8_t v) { return YAML::Node{v}; } +inline auto toYaml(uint8_t v) { return YAML::Node{v}; } +inline auto toYaml(int16_t v) { return YAML::Node{v}; } +inline auto toYaml(uint16_t v) { return YAML::Node{v}; } +inline auto toYaml(int32_t v) { return YAML::Node{v}; } +inline auto toYaml(uint32_t v) { return YAML::Node{v}; } +inline auto toYaml(int64_t v) { return YAML::Node{v}; } +inline auto toYaml(uint64_t v) { return YAML::Node{v}; } inline auto toYaml(std::monostate const&) { return YAML::Node(YAML::NodeType::Undefined); } @@ -725,6 +719,33 @@ def epilogue(self, root_loader: Optional[TypeDef]) -> None: return YAML::Node{v}; } +template +auto anyToYaml_impl(std::any const& a) { + if (auto v = std::any_cast(&a)) { + return toYaml(*v); + } + if constexpr (sizeof...(Args) > 0) { + return anyToYaml_impl(a); + } + return toYaml(std::monostate{}); +} + +inline auto toYaml(std::any const& a) { + return anyToYaml_impl(a); +} + // declaring fromYaml inline void fromYaml(YAML::Node const& n, bool& v) { v = n.as();