From 17d51554de925a3642ab520e5e700735f43b3252 Mon Sep 17 00:00:00 2001 From: Ezekiel Warren Date: Fri, 31 May 2024 17:32:40 -0700 Subject: [PATCH] feat: allow string parameters --- ecsact/detail/grammar.hh | 22 ++++++++++++++++++++-- test/parse_test_parameter.cc | 18 ++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/ecsact/detail/grammar.hh b/ecsact/detail/grammar.hh index c99e28d..c20df41 100644 --- a/ecsact/detail/grammar.hh +++ b/ecsact/detail/grammar.hh @@ -106,9 +106,16 @@ struct parameter_value { static constexpr auto value = lexy::forward; }; - static constexpr auto rule = lexy::dsl::p | lexy::dsl::p; + struct string { + static constexpr auto rule = lexy::dsl::identifier(lexy::dsl::ascii::alpha); + static constexpr auto value = + lexy::as_string; + }; + + static constexpr auto rule = lexy::dsl::p | lexy::dsl::p | + lexy::dsl::p; - using value_variant = std::variant; + using value_variant = std::variant; static constexpr auto value = lexy::callback( [](auto&& value) -> value_variant { return value_variant{value}; } @@ -128,6 +135,17 @@ struct parameter { param.value.data.bool_value = value; } + static void _set_value( + ecsact_statement_parameter& param, + std::string_view value + ) { + param.value.type = ECSACT_STATEMENT_PARAM_VALUE_TYPE_STRING; + param.value.data.string_value = ecsact_statement_sv{ + .data = value.data(), + .length = static_cast(value.size()), + }; + } + static constexpr auto rule = lexy::dsl::p >> lexy::dsl::opt(lexy::dsl::lit_c<':'> >> lexy::dsl::p); diff --git a/test/parse_test_parameter.cc b/test/parse_test_parameter.cc index 24465e6..7ab72db 100644 --- a/test/parse_test_parameter.cc +++ b/test/parse_test_parameter.cc @@ -8,6 +8,7 @@ #include "ecsact/parse.h" using namespace std::string_literals; +using namespace std::string_view_literals; using test_param_expected = std::vector(expected_value.string_value.length) ), - std::string( + std::string_view( statement.parameters[i].value.data.string_value.data, static_cast( statement.parameters[i].value.data.string_value.length @@ -189,4 +190,17 @@ TEST(Parse, MultiParam) { ), } ); + + test_param( + "(cool_str_param: whatup)", + { + std::make_tuple( + "cool_str_param"s, + ECSACT_STATEMENT_PARAM_VALUE_TYPE_STRING, + ecsact_statement_parameter_value_data{ + .string_value{"whatup"sv.data(), "whatup"sv.size()} + } + ), + } + ); }