From 19de5714f4beeacd95cad9cbeb703d9b1430bdd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Thu, 22 Aug 2024 16:08:05 +0200 Subject: [PATCH] added data_type_traits for enums --- demo/main.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/demo/main.cpp b/demo/main.cpp index 7751a7d..618b70c 100644 --- a/demo/main.cpp +++ b/demo/main.cpp @@ -5,6 +5,7 @@ #include "matador/sql/entity.hpp" #include "matador/utils/access.hpp" +#include "matador/utils/enum_mapper.hpp" #include "matador/sql/query_helper.hpp" @@ -90,6 +91,71 @@ struct job { } }; +static const matador::utils::enum_mapper job_state_enum({ + {job::job_state::Pending, "Pending"}, + {job::job_state::Running, "Running"}, + {job::job_state::Succeeded, "Succeeded"}, + {job::job_state::Failed, "Failed"}, + {job::job_state::Canceled, "Canceled"} + }); + +static const matador::utils::enum_mapper job_mode_enum({ + {job::job_mode::Foreground, "Foreground"}, + {job::job_mode::Background, "Background"} + }); + +template<> +struct matador::sql::data_type_traits +{ + inline static data_type_t builtin_type(std::size_t size) + { return data_type_traits::builtin_type(size); } + + static void read_value(query_result_reader &reader, const char *id, size_t index, job::job_state &value) + { + std::string enum_string; + reader.read_value(id, index, enum_string, 64); + if (const auto enum_opt = job_state_enum.to_enum(enum_string)) { + value = enum_opt.value(); + } + } + + static any_type create_value(const job::job_state &value) + { + return job_state_enum.to_string(value); + } + + static void bind_value(parameter_binder &binder, size_t index, job::job_state &value) + { + binder.bind(index, job_state_enum.to_string(value)); + } +}; + +template<> +struct matador::sql::data_type_traits +{ + inline static data_type_t builtin_type(std::size_t size) + { return data_type_traits::builtin_type(size); } + + static void read_value(query_result_reader &reader, const char *id, size_t index, job::job_mode &value) + { + std::string enum_string; + reader.read_value(id, index, enum_string, 64); + if (const auto enum_opt = job_mode_enum.to_enum(enum_string)) { + value = enum_opt.value(); + } + } + + static any_type create_value(const job::job_mode &value) + { + return job_mode_enum.to_string(value); + } + + static void bind_value(parameter_binder &binder, size_t index, job::job_mode &value) + { + binder.bind(index, job_mode_enum.to_string(value)); + } +}; + QUERY_HELPER( authors, id, first_name, last_name, date_of_birth, year_of_birth, distinguished ) QUERY_HELPER( books, id, author_id, title, published_in )