@@ -138,6 +138,33 @@ auto statement_param<bool>( //
138138 return result;
139139}
140140
141+ template <>
142+ auto statement_param<std::string_view>( //
143+ const ecsact_statement& statement,
144+ std::string_view param_name
145+ ) -> std::optional<std::string_view> {
146+ auto result = std::optional<std::string_view>{};
147+ for (auto & param : view_statement_params (statement)) {
148+ if (std::string_view{
149+ param.name .data ,
150+ static_cast <size_t >(param.name .length )
151+ } != param_name) {
152+ continue ;
153+ }
154+
155+ if (param.value .type != ECSACT_STATEMENT_PARAM_VALUE_TYPE_STRING) {
156+ break ;
157+ }
158+
159+ result = std::string_view{
160+ param.value .data .string_value .data ,
161+ static_cast <size_t >(param.value .data .string_value .length ),
162+ };
163+ }
164+
165+ return result;
166+ }
167+
141168template <typename FirstT, typename SecondT>
142169auto statement_param ( //
143170 const ecsact_statement& statement,
@@ -162,6 +189,38 @@ auto statement_param( //
162189 return std::nullopt ;
163190}
164191
192+ static auto parallel_param (const ecsact_statement& statement
193+ ) -> std::variant<ecsact_parallel_execution, ecsact_eval_error_code> {
194+ using result_t =
195+ std::variant<ecsact_parallel_execution, ecsact_eval_error_code>;
196+
197+ auto param = statement_param<bool , std::string_view>(statement, " parallel" );
198+ if (!param) {
199+ return ECSACT_PAR_EXEC_AUTO;
200+ }
201+
202+ auto result = std::visit (
203+ overloaded{
204+ [&](bool param) -> result_t {
205+ return param ? ECSACT_PAR_EXEC_PREFERRED : ECSACT_PAR_EXEC_DENY;
206+ },
207+ [&](std::string_view param) -> result_t {
208+ if (param == " auto" ) {
209+ return ECSACT_PAR_EXEC_AUTO;
210+ } else if (param == " preferred" ) {
211+ return ECSACT_PAR_EXEC_PREFERRED;
212+ } else if (param == " deny" ) {
213+ return ECSACT_PAR_EXEC_DENY;
214+ } else {
215+ return ECSACT_EVAL_ERR_INVALID_PARAMETER_VALUE;
216+ }
217+ }
218+ },
219+ *param
220+ );
221+ return result;
222+ }
223+
165224auto allow_statement_params ( //
166225 const ecsact_statement& statement,
167226 const ecsact_statement* context,
@@ -803,10 +862,17 @@ static ecsact_eval_error eval_system_statement(
803862 ecsact_set_system_lazy_iteration_rate (sys_id, lazy_value);
804863 }
805864
806- auto parallel = statement_param<bool >(statement, " parallel" ).value_or (false );
865+ auto parallel = parallel_param (statement);
866+ if (auto err_code = std::get_if<ecsact_eval_error_code>(¶llel)) {
867+ return ecsact_eval_error{
868+ .code = *err_code,
869+ .relevant_content = data.system_name ,
870+ };
871+ }
872+
807873 ecsact_set_system_parallel_execution (
808874 ecsact_id_cast<ecsact_system_like_id>(sys_id),
809- parallel
875+ std::get<ecsact_parallel_execution>( parallel)
810876 );
811877
812878 return {};
@@ -845,10 +911,17 @@ static ecsact_eval_error eval_action_statement(
845911 data.action_name .length
846912 );
847913
848- auto parallel = statement_param<bool >(statement, " parallel" ).value_or (false );
914+ auto parallel = parallel_param (statement);
915+ if (auto err_code = std::get_if<ecsact_eval_error_code>(¶llel)) {
916+ return ecsact_eval_error{
917+ .code = *err_code,
918+ .relevant_content = data.action_name ,
919+ };
920+ }
921+
849922 ecsact_set_system_parallel_execution (
850923 ecsact_id_cast<ecsact_system_like_id>(act_id),
851- parallel
924+ std::get<ecsact_parallel_execution>( parallel)
852925 );
853926
854927 return {};
0 commit comments