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>(¶m);
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>(¶m);
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