blob: 98ae2a5d05f73ba734f5d807e6cf62499b7d20c8 [file] [log] [blame]
Cezary Zwolak4416fce2021-03-17 03:21:06 +01001#include "utils/conversion_trigger.hpp"
2
3#include "utils/transform.hpp"
Szymon Dompke94f71c52021-12-10 07:16:33 +01004#include "utils/tstring.hpp"
Cezary Zwolak4416fce2021-03-17 03:21:06 +01005
6#include <sdbusplus/exception.hpp>
7
8namespace utils
9{
10namespace ts = utils::tstring;
11
12LabeledTriggerThresholdParams ToLabeledThresholdParamConversion::operator()(
13 const std::monostate& arg) const
14{
15 throw sdbusplus::exception::SdBusError(
16 static_cast<int>(std::errc::invalid_argument),
17 "Provided threshold parameter is invalid");
18}
19
20LabeledTriggerThresholdParams ToLabeledThresholdParamConversion::operator()(
21 const std::vector<numeric::ThresholdParam>& arg) const
22{
23 return utils::transform(arg, [](const auto& thresholdParam) {
Patrick Williams3a1c2972023-05-10 07:51:04 -050024 const auto& [type, dwellTime, direction,
25 thresholdValue] = thresholdParam;
Krzysztof Grobelny51497a02021-11-09 14:56:22 +010026 return numeric::LabeledThresholdParam(numeric::toType(type), dwellTime,
27 numeric::toDirection(direction),
28 thresholdValue);
Cezary Zwolak4416fce2021-03-17 03:21:06 +010029 });
30}
31
32LabeledTriggerThresholdParams ToLabeledThresholdParamConversion::operator()(
33 const std::vector<discrete::ThresholdParam>& arg) const
34{
35 return utils::transform(arg, [](const auto& thresholdParam) {
Patrick Williams3a1c2972023-05-10 07:51:04 -050036 const auto& [userId, severity, dwellTime,
37 thresholdValue] = thresholdParam;
Cezary Zwolak4416fce2021-03-17 03:21:06 +010038 return discrete::LabeledThresholdParam(
Krzysztof Grobelnycff70c12022-10-27 07:16:08 +000039 userId, utils::toSeverity(severity), dwellTime, thresholdValue);
Cezary Zwolak4416fce2021-03-17 03:21:06 +010040 });
41}
42
43TriggerThresholdParams FromLabeledThresholdParamConversion::operator()(
44 const std::vector<numeric::LabeledThresholdParam>& arg) const
45{
46 return utils::transform(
Patrick Williams3a1c2972023-05-10 07:51:04 -050047 arg,
48 [](const numeric::LabeledThresholdParam& labeledThresholdParam) {
49 return numeric::ThresholdParam(
50 numeric::typeToString(labeledThresholdParam.at_label<ts::Type>()),
51 labeledThresholdParam.at_label<ts::DwellTime>(),
52 numeric::directionToString(
53 labeledThresholdParam.at_label<ts::Direction>()),
54 labeledThresholdParam.at_label<ts::ThresholdValue>());
Cezary Zwolak4416fce2021-03-17 03:21:06 +010055 });
56}
57
58TriggerThresholdParams FromLabeledThresholdParamConversion::operator()(
59 const std::vector<discrete::LabeledThresholdParam>& arg) const
60{
61 return utils::transform(
Krzysztof Grobelnycff70c12022-10-27 07:16:08 +000062 arg,
63 [](const discrete::LabeledThresholdParam& labeledThresholdParam) {
64 return discrete::ThresholdParam(
65 labeledThresholdParam.at_label<ts::UserId>(),
66 utils::enumToString(labeledThresholdParam.at_label<ts::Severity>()),
67 labeledThresholdParam.at_label<ts::DwellTime>(),
68 labeledThresholdParam.at_label<ts::ThresholdValue>());
Cezary Zwolak4416fce2021-03-17 03:21:06 +010069 });
70}
71
72SensorsInfo fromLabeledSensorsInfo(const std::vector<LabeledSensorInfo>& infos)
73{
74 return utils::transform(infos, [](const LabeledSensorInfo& val) {
75 return SensorsInfo::value_type(
Szymon Dompke94f71c52021-12-10 07:16:33 +010076 sdbusplus::message::object_path(val.at_label<ts::Path>()),
Krzysztof Grobelnyb8cc78d2021-11-29 15:54:53 +010077 val.at_label<ts::Metadata>());
Cezary Zwolak4416fce2021-03-17 03:21:06 +010078 });
79}
80
Szymon Dompke94f71c52021-12-10 07:16:33 +010081TriggerThresholdParams
82 fromLabeledThresholdParam(const std::vector<LabeledThresholdParam>& params)
83{
84 namespace ts = utils::tstring;
Krzysztof Grobelny55824552022-02-18 16:15:31 +010085 if (params.empty())
86 {
87 return std::vector<numeric::ThresholdParam>();
88 }
89
Szymon Dompke94f71c52021-12-10 07:16:33 +010090 if (isFirstElementOfType<std::monostate>(params))
91 {
92 return std::vector<discrete::ThresholdParam>();
93 }
94
95 if (isFirstElementOfType<discrete::LabeledThresholdParam>(params))
96 {
97 return utils::transform(params, [](const auto& param) {
98 const discrete::LabeledThresholdParam* paramUnpacked =
99 std::get_if<discrete::LabeledThresholdParam>(&param);
100 if (!paramUnpacked)
101 {
102 throw std::runtime_error(
103 "Mixing threshold types is not allowed");
104 }
105 return discrete::ThresholdParam(
106 paramUnpacked->at_label<ts::UserId>(),
Krzysztof Grobelnycff70c12022-10-27 07:16:08 +0000107 utils::enumToString(paramUnpacked->at_label<ts::Severity>()),
Szymon Dompke94f71c52021-12-10 07:16:33 +0100108 paramUnpacked->at_label<ts::DwellTime>(),
109 paramUnpacked->at_label<ts::ThresholdValue>());
110 });
111 }
112
113 if (isFirstElementOfType<numeric::LabeledThresholdParam>(params))
114 {
115 return utils::transform(params, [](const auto& param) {
116 const numeric::LabeledThresholdParam* paramUnpacked =
117 std::get_if<numeric::LabeledThresholdParam>(&param);
118 if (!paramUnpacked)
119 {
120 throw std::runtime_error(
121 "Mixing threshold types is not allowed");
122 }
123 return numeric::ThresholdParam(
124 numeric::typeToString(paramUnpacked->at_label<ts::Type>()),
125 paramUnpacked->at_label<ts::DwellTime>(),
126 numeric::directionToString(
127 paramUnpacked->at_label<ts::Direction>()),
128 paramUnpacked->at_label<ts::ThresholdValue>());
129 });
130 }
131
132 throw std::runtime_error("Incorrect threshold params");
133}
134
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100135nlohmann::json labeledThresholdParamsToJson(
136 const LabeledTriggerThresholdParams& labeledThresholdParams)
137{
138 return std::visit([](const auto& lt) { return nlohmann::json(lt); },
139 labeledThresholdParams);
140}
141
Szymon Dompkeaa572362022-03-23 16:31:24 +0100142double stodStrict(const std::string& str)
143{
144 size_t pos = 0;
145 double result = std::stod(str, &pos);
146 if (pos < str.length())
147 {
148 throw std::invalid_argument(
149 "non-numeric characters at the end of string");
150 }
151 return result;
152}
153
Cezary Zwolak4416fce2021-03-17 03:21:06 +0100154} // namespace utils