14416fce6SCezary Zwolak #include "utils/conversion_trigger.hpp"
24416fce6SCezary Zwolak 
34416fce6SCezary Zwolak #include "utils/transform.hpp"
494f71c51SSzymon Dompke #include "utils/tstring.hpp"
54416fce6SCezary Zwolak 
64416fce6SCezary Zwolak #include <sdbusplus/exception.hpp>
74416fce6SCezary Zwolak 
84416fce6SCezary Zwolak namespace utils
94416fce6SCezary Zwolak {
104416fce6SCezary Zwolak namespace ts = utils::tstring;
114416fce6SCezary Zwolak 
operator ()(const std::monostate & arg) const124416fce6SCezary Zwolak LabeledTriggerThresholdParams ToLabeledThresholdParamConversion::operator()(
134416fce6SCezary Zwolak     const std::monostate& arg) const
144416fce6SCezary Zwolak {
154416fce6SCezary Zwolak     throw sdbusplus::exception::SdBusError(
164416fce6SCezary Zwolak         static_cast<int>(std::errc::invalid_argument),
174416fce6SCezary Zwolak         "Provided threshold parameter is invalid");
184416fce6SCezary Zwolak }
194416fce6SCezary Zwolak 
operator ()(const std::vector<numeric::ThresholdParam> & arg) const204416fce6SCezary Zwolak LabeledTriggerThresholdParams ToLabeledThresholdParamConversion::operator()(
214416fce6SCezary Zwolak     const std::vector<numeric::ThresholdParam>& arg) const
224416fce6SCezary Zwolak {
234416fce6SCezary Zwolak     return utils::transform(arg, [](const auto& thresholdParam) {
243a1c297aSPatrick Williams         const auto& [type, dwellTime, direction,
253a1c297aSPatrick Williams                      thresholdValue] = thresholdParam;
2651497a0cSKrzysztof Grobelny         return numeric::LabeledThresholdParam(numeric::toType(type), dwellTime,
2751497a0cSKrzysztof Grobelny                                               numeric::toDirection(direction),
2851497a0cSKrzysztof Grobelny                                               thresholdValue);
294416fce6SCezary Zwolak     });
304416fce6SCezary Zwolak }
314416fce6SCezary Zwolak 
operator ()(const std::vector<discrete::ThresholdParam> & arg) const324416fce6SCezary Zwolak LabeledTriggerThresholdParams ToLabeledThresholdParamConversion::operator()(
334416fce6SCezary Zwolak     const std::vector<discrete::ThresholdParam>& arg) const
344416fce6SCezary Zwolak {
354416fce6SCezary Zwolak     return utils::transform(arg, [](const auto& thresholdParam) {
363a1c297aSPatrick Williams         const auto& [userId, severity, dwellTime,
373a1c297aSPatrick Williams                      thresholdValue] = thresholdParam;
384416fce6SCezary Zwolak         return discrete::LabeledThresholdParam(
39cff70c14SKrzysztof Grobelny             userId, utils::toSeverity(severity), dwellTime, thresholdValue);
404416fce6SCezary Zwolak     });
414416fce6SCezary Zwolak }
424416fce6SCezary Zwolak 
operator ()(const std::vector<numeric::LabeledThresholdParam> & arg) const434416fce6SCezary Zwolak TriggerThresholdParams FromLabeledThresholdParamConversion::operator()(
444416fce6SCezary Zwolak     const std::vector<numeric::LabeledThresholdParam>& arg) const
454416fce6SCezary Zwolak {
464416fce6SCezary Zwolak     return utils::transform(
47*c7935fa1SPatrick Williams         arg, [](const numeric::LabeledThresholdParam& labeledThresholdParam) {
484416fce6SCezary Zwolak         return numeric::ThresholdParam(
493a1c297aSPatrick Williams             numeric::typeToString(labeledThresholdParam.at_label<ts::Type>()),
504416fce6SCezary Zwolak             labeledThresholdParam.at_label<ts::DwellTime>(),
514416fce6SCezary Zwolak             numeric::directionToString(
524416fce6SCezary Zwolak                 labeledThresholdParam.at_label<ts::Direction>()),
534416fce6SCezary Zwolak             labeledThresholdParam.at_label<ts::ThresholdValue>());
544416fce6SCezary Zwolak     });
554416fce6SCezary Zwolak }
564416fce6SCezary Zwolak 
operator ()(const std::vector<discrete::LabeledThresholdParam> & arg) const574416fce6SCezary Zwolak TriggerThresholdParams FromLabeledThresholdParamConversion::operator()(
584416fce6SCezary Zwolak     const std::vector<discrete::LabeledThresholdParam>& arg) const
594416fce6SCezary Zwolak {
604416fce6SCezary Zwolak     return utils::transform(
61*c7935fa1SPatrick Williams         arg, [](const discrete::LabeledThresholdParam& labeledThresholdParam) {
624416fce6SCezary Zwolak         return discrete::ThresholdParam(
634416fce6SCezary Zwolak             labeledThresholdParam.at_label<ts::UserId>(),
64cff70c14SKrzysztof Grobelny             utils::enumToString(labeledThresholdParam.at_label<ts::Severity>()),
654416fce6SCezary Zwolak             labeledThresholdParam.at_label<ts::DwellTime>(),
664416fce6SCezary Zwolak             labeledThresholdParam.at_label<ts::ThresholdValue>());
674416fce6SCezary Zwolak     });
684416fce6SCezary Zwolak }
694416fce6SCezary Zwolak 
fromLabeledSensorsInfo(const std::vector<LabeledSensorInfo> & infos)704416fce6SCezary Zwolak SensorsInfo fromLabeledSensorsInfo(const std::vector<LabeledSensorInfo>& infos)
714416fce6SCezary Zwolak {
724416fce6SCezary Zwolak     return utils::transform(infos, [](const LabeledSensorInfo& val) {
734416fce6SCezary Zwolak         return SensorsInfo::value_type(
7494f71c51SSzymon Dompke             sdbusplus::message::object_path(val.at_label<ts::Path>()),
75b8cc78ddSKrzysztof Grobelny             val.at_label<ts::Metadata>());
764416fce6SCezary Zwolak     });
774416fce6SCezary Zwolak }
784416fce6SCezary Zwolak 
7994f71c51SSzymon Dompke TriggerThresholdParams
fromLabeledThresholdParam(const std::vector<LabeledThresholdParam> & params)8094f71c51SSzymon Dompke     fromLabeledThresholdParam(const std::vector<LabeledThresholdParam>& params)
8194f71c51SSzymon Dompke {
8294f71c51SSzymon Dompke     namespace ts = utils::tstring;
8355824558SKrzysztof Grobelny     if (params.empty())
8455824558SKrzysztof Grobelny     {
8555824558SKrzysztof Grobelny         return std::vector<numeric::ThresholdParam>();
8655824558SKrzysztof Grobelny     }
8755824558SKrzysztof Grobelny 
8894f71c51SSzymon Dompke     if (isFirstElementOfType<std::monostate>(params))
8994f71c51SSzymon Dompke     {
9094f71c51SSzymon Dompke         return std::vector<discrete::ThresholdParam>();
9194f71c51SSzymon Dompke     }
9294f71c51SSzymon Dompke 
9394f71c51SSzymon Dompke     if (isFirstElementOfType<discrete::LabeledThresholdParam>(params))
9494f71c51SSzymon Dompke     {
9594f71c51SSzymon Dompke         return utils::transform(params, [](const auto& param) {
9694f71c51SSzymon Dompke             const discrete::LabeledThresholdParam* paramUnpacked =
9794f71c51SSzymon Dompke                 std::get_if<discrete::LabeledThresholdParam>(&param);
9894f71c51SSzymon Dompke             if (!paramUnpacked)
9994f71c51SSzymon Dompke             {
10094f71c51SSzymon Dompke                 throw std::runtime_error(
10194f71c51SSzymon Dompke                     "Mixing threshold types is not allowed");
10294f71c51SSzymon Dompke             }
10394f71c51SSzymon Dompke             return discrete::ThresholdParam(
10494f71c51SSzymon Dompke                 paramUnpacked->at_label<ts::UserId>(),
105cff70c14SKrzysztof Grobelny                 utils::enumToString(paramUnpacked->at_label<ts::Severity>()),
10694f71c51SSzymon Dompke                 paramUnpacked->at_label<ts::DwellTime>(),
10794f71c51SSzymon Dompke                 paramUnpacked->at_label<ts::ThresholdValue>());
10894f71c51SSzymon Dompke         });
10994f71c51SSzymon Dompke     }
11094f71c51SSzymon Dompke 
11194f71c51SSzymon Dompke     if (isFirstElementOfType<numeric::LabeledThresholdParam>(params))
11294f71c51SSzymon Dompke     {
11394f71c51SSzymon Dompke         return utils::transform(params, [](const auto& param) {
11494f71c51SSzymon Dompke             const numeric::LabeledThresholdParam* paramUnpacked =
11594f71c51SSzymon Dompke                 std::get_if<numeric::LabeledThresholdParam>(&param);
11694f71c51SSzymon Dompke             if (!paramUnpacked)
11794f71c51SSzymon Dompke             {
11894f71c51SSzymon Dompke                 throw std::runtime_error(
11994f71c51SSzymon Dompke                     "Mixing threshold types is not allowed");
12094f71c51SSzymon Dompke             }
12194f71c51SSzymon Dompke             return numeric::ThresholdParam(
12294f71c51SSzymon Dompke                 numeric::typeToString(paramUnpacked->at_label<ts::Type>()),
12394f71c51SSzymon Dompke                 paramUnpacked->at_label<ts::DwellTime>(),
12494f71c51SSzymon Dompke                 numeric::directionToString(
12594f71c51SSzymon Dompke                     paramUnpacked->at_label<ts::Direction>()),
12694f71c51SSzymon Dompke                 paramUnpacked->at_label<ts::ThresholdValue>());
12794f71c51SSzymon Dompke         });
12894f71c51SSzymon Dompke     }
12994f71c51SSzymon Dompke 
13094f71c51SSzymon Dompke     throw std::runtime_error("Incorrect threshold params");
13194f71c51SSzymon Dompke }
13294f71c51SSzymon Dompke 
labeledThresholdParamsToJson(const LabeledTriggerThresholdParams & labeledThresholdParams)1334416fce6SCezary Zwolak nlohmann::json labeledThresholdParamsToJson(
1344416fce6SCezary Zwolak     const LabeledTriggerThresholdParams& labeledThresholdParams)
1354416fce6SCezary Zwolak {
1364416fce6SCezary Zwolak     return std::visit([](const auto& lt) { return nlohmann::json(lt); },
1374416fce6SCezary Zwolak                       labeledThresholdParams);
1384416fce6SCezary Zwolak }
1394416fce6SCezary Zwolak 
stodStrict(const std::string & str)140aa572361SSzymon Dompke double stodStrict(const std::string& str)
141aa572361SSzymon Dompke {
142aa572361SSzymon Dompke     size_t pos = 0;
143aa572361SSzymon Dompke     double result = std::stod(str, &pos);
144aa572361SSzymon Dompke     if (pos < str.length())
145aa572361SSzymon Dompke     {
146aa572361SSzymon Dompke         throw std::invalid_argument(
147aa572361SSzymon Dompke             "non-numeric characters at the end of string");
148aa572361SSzymon Dompke     }
149aa572361SSzymon Dompke     return result;
150aa572361SSzymon Dompke }
151aa572361SSzymon Dompke 
1524416fce6SCezary Zwolak } // namespace utils
153