1111 * SPDX-License-Identifier: Apache-2.0
1212 ********************************************************************************/
1313#pragma once
14- #include " internal/error.hpp"
15- #include " score/json/json_parser.h"
16- #include " score/json/json_writer.h"
17- #include < cstdint>
18- #include < fstream>
14+
1915#include < kvs.hpp>
20- #include < kvsbuilder.hpp>
21- #include < nlohmann/json.hpp>
22- #include < optional>
23- #include < stdexcept>
24- #include < string>
2516
2617// Custom exception type for error code propagation
2718class ScenarioError : public std ::runtime_error {
28- public:
29- score::mw::per::kvs::ErrorCode code;
30- ScenarioError (score::mw::per::kvs::ErrorCode code, const std::string &msg)
31- : std::runtime_error(msg), code(code) {}
19+ public:
20+ score::mw::per::kvs::ErrorCode code;
21+ ScenarioError (score::mw::per::kvs::ErrorCode code, const std::string &msg)
22+ : std::runtime_error(msg), code(code) {}
3223};
3324
3425namespace {
3526
3627struct KvsParameters {
37- uint64_t instance_id;
38- std::optional<bool > need_defaults;
39- std::optional<bool > need_kvs;
40- std::optional<std::string> dir;
28+ uint64_t instance_id;
29+ std::optional<bool > need_defaults;
30+ std::optional<bool > need_kvs;
31+ std::optional<std::string> dir;
4132};
4233
4334KvsParameters map_to_params (const std::string &data) {
44- using namespace score ::json;
35+ using namespace score ::json;
4536
46- JsonParser parser;
47- auto any_res{parser.FromBuffer (data)};
48- if (!any_res) {
49- throw ScenarioError (score::mw::per::kvs::ErrorCode::JsonParserError,
50- " Failed to parse JSON data" );
51- }
52- const auto &map_root{
53- any_res.value ().As <Object>().value ().get ().at (" kvs_parameters" )};
54- const auto &obj_root{map_root.As <Object>().value ().get ()};
37+ JsonParser parser;
38+ auto any_res{parser.FromBuffer (data)};
39+ if (!any_res) {
40+ throw ScenarioError (score::mw::per::kvs::ErrorCode::JsonParserError,
41+ " Failed to parse JSON data" );
42+ }
43+ const auto &map_root{
44+ any_res.value ().As <Object>().value ().get ().at (" kvs_parameters" )};
45+ const auto &obj_root{map_root.As <Object>().value ().get ()};
5546
56- KvsParameters params;
57- params.instance_id = obj_root.at (" instance_id" ).As <double >().value ();
58- // Precedence: direct 'need_defaults' field overrides inference from
59- // 'defaults'.
60- if (obj_root.find (" need_defaults" ) != obj_root.end ()) {
61- params.need_defaults = obj_root.at (" need_defaults" ).As <bool >().value ();
62- } else {
63- // If 'need_defaults' is not present, infer from 'defaults' field.
64- if (obj_root.find (" defaults" ) != obj_root.end ()) {
65- auto defaults_val = obj_root.at (" defaults" ).As <std::string>().value ();
66- if (defaults_val.get () == " required" ) {
67- params.need_defaults = true ;
68- } else if (defaults_val.get () == " optional" ||
69- defaults_val.get () == " without" ) {
70- params.need_defaults = false ;
71- }
47+ KvsParameters params;
48+ params.instance_id = obj_root.at (" instance_id" ).As <double >().value ();
49+ // Precedence: direct 'need_defaults' field overrides inference from
50+ // 'defaults'.
51+ if (obj_root.find (" need_defaults" ) != obj_root.end ()) {
52+ params.need_defaults = obj_root.at (" need_defaults" ).As <bool >().value ();
53+ } else {
54+ // If 'need_defaults' is not present, infer from 'defaults' field.
55+ if (obj_root.find (" defaults" ) != obj_root.end ()) {
56+ auto defaults_val =
57+ obj_root.at (" defaults" ).As <std::string>().value ();
58+ if (defaults_val.get () == " required" ) {
59+ params.need_defaults = true ;
60+ } else if (defaults_val.get () == " optional" ||
61+ defaults_val.get () == " without" ) {
62+ params.need_defaults = false ;
63+ }
64+ }
65+ }
66+ if (obj_root.find (" need_kvs" ) != obj_root.end ()) {
67+ params.need_kvs = obj_root.at (" need_kvs" ).As <bool >().value ();
68+ }
69+ if (obj_root.find (" dir" ) != obj_root.end ()) {
70+ params.dir = obj_root.at (" dir" ).As <std::string>().value ();
7271 }
73- }
74- if (obj_root.find (" need_kvs" ) != obj_root.end ()) {
75- params.need_kvs = obj_root.at (" need_kvs" ).As <bool >().value ();
76- }
77- if (obj_root.find (" dir" ) != obj_root.end ()) {
78- params.dir = obj_root.at (" dir" ).As <std::string>().value ();
79- }
8072
81- // Explicitly check for missing defaults file if required
82- if (params.need_defaults .value_or (false )) {
83- if (params.dir .has_value ()) {
84- std::string defaults_path = *params.dir + " /kvs_" +
85- std::to_string (params.instance_id ) +
86- " _default.json" ;
87- std::ifstream defaults_file (defaults_path);
88- if (!defaults_file.good ()) {
89- throw ScenarioError (score::mw::per::kvs::ErrorCode::KvsFileReadError,
90- " Defaults file missing: " + defaults_path);
91- }
73+ // Explicitly check for missing defaults file if required
74+ if (params.need_defaults .value_or (false )) {
75+ if (params.dir .has_value ()) {
76+ std::string defaults_path = *params.dir + " /kvs_" +
77+ std::to_string (params.instance_id ) +
78+ " _default.json" ;
79+ std::ifstream defaults_file (defaults_path);
80+ if (!defaults_file.good ()) {
81+ throw ScenarioError (
82+ score::mw::per::kvs::ErrorCode::KvsFileReadError,
83+ " Defaults file missing: " + defaults_path);
84+ }
85+ }
9286 }
93- }
9487
95- return params;
88+ return params;
9689}
9790
9891} // namespace
0 commit comments