1+ #include " ./config_node_with_preset.hpp"
2+
3+ namespace sim {
4+
5+ ConfigNodeWithPreset::ConfigNodeWithPreset (ConfigNode a_node, std::optional<ConfigNode> a_presets_node, std::optional<ConfigNode> a_preset)
6+ : m_node(std::move(a_node)), m_presets_node(std::move(a_presets_node)), m_preset(std::move(a_preset)){}
7+
8+ ConfigNodeWithPresetExpected ConfigNodeWithPreset::operator [](std::string_view key) const {
9+ const ConfigNodeExpected child_node = m_node[key];
10+ if (!child_node.has_value ()){
11+ // m_node hasn't key. Tries to find key in m_preset
12+ if (!m_preset.has_value ()){
13+ // m_preset doesn't exist. Tries to find preset for this node
14+ if (!m_presets_node.has_value ()){
15+ // m_presets_node doesn't exist. Returns message about it
16+ std::stringstream ss;
17+ ss << " Key error: node " << m_node << " :\n " ;
18+ ss << " does not have key " << key;
19+ return std::unexpected (ss.str ());
20+ }
21+ // m_presets_node exist. Tries to find field 'preset-name' in m_node
22+ ConfigNodeExpected node_preset_name = m_node[" preset-name" ];
23+ if (!node_preset_name.has_value ()){
24+ // config hasn't field 'preset-name'. Returns message about it
25+ std::stringstream ss;
26+ ss << " Key error: node " << m_node << " :\n " ;
27+ ss << " does not have key `preset-name`" ;
28+ return std::unexpected (ss.str ());
29+ }
30+ // field 'preset-name' was found. Tries to convert it to string
31+ ConfigNode presets_node = m_presets_node.value ();
32+ utils::StrExpected<std::string> preset_name = node_preset_name.value ().as <std::string>();
33+ if (!preset_name.has_value ()){
34+ // field 'preset-name' couldn't be converted to string. Returns message about it
35+ std::stringstream ss;
36+ ss << " Error: field 'preset-name' in node " << m_node << ' \n ' ;
37+ ss << " couldn't be converted to string" ;
38+ return std::unexpected (ss.str ());
39+ }
40+ // conversion is successful. tries to find preset in m_presets_node
41+ ConfigNodeExpected preset_node = presets_node[preset_name.value ()];
42+ if (!preset_node.has_value ()){
43+ // m_presets_node hasn't preset with the specified name in config. Retruns message about it
44+ std::stringstream ss;
45+ ss << " Error: preset named '" << preset_name.value () << " ' of node " << m_node << ' \n ' ;
46+ ss << " can not be found in presets node:" << presets_node << " :\n " ;
47+ return std::unexpected (ss.str ());
48+ }
49+ // preset was found successfull. put the found value in m_preset
50+ m_preset.emplace (preset_node.value ());
51+ }
52+ // tries to find key in preset
53+ ConfigNodeExpected key_node = m_preset.value ()[key];
54+ if (!key_node.has_value ()){
55+ // m_preset hasn't key. Returns message about it
56+ std::stringstream ss;
57+ ss << " Key error: preset '" << m_preset.value ().get_name ().value () << " ' " ;
58+ ss << " does not have key: " << key;
59+ return std::unexpected (ss.str ());
60+ }
61+ // key was found in preset
62+ return ConfigNodeWithPreset (key_node.value (), m_presets_node, m_preset);
63+ }
64+ // key was found in m_node
65+ return ConfigNodeWithPreset (child_node.value (), m_presets_node, m_preset);
66+ }
67+
68+ const std::string& ConfigNodeWithPreset::get_name_or_throw () const {
69+ return m_node.get_name_or_throw ();
70+ }
71+
72+ const ConfigNode& ConfigNodeWithPreset::get_node () const noexcept {
73+ return m_node;
74+ }
75+
76+ } // namespace sim
0 commit comments