1 #pragma once
2 
3 #include "interfaces/json_storage.hpp"
4 #include "types/trigger_types.hpp"
5 
6 namespace utils
7 {
8 
9 class ToLabeledThresholdParamConversion
10 {
11   public:
12     LabeledTriggerThresholdParams operator()(const std::monostate& arg) const;
13     LabeledTriggerThresholdParams
14         operator()(const std::vector<numeric::ThresholdParam>& arg) const;
15     LabeledTriggerThresholdParams
16         operator()(const std::vector<discrete::ThresholdParam>& arg) const;
17 };
18 
19 class FromLabeledThresholdParamConversion
20 {
21   public:
22     TriggerThresholdParams operator()(
23         const std::vector<numeric::LabeledThresholdParam>& arg) const;
24     TriggerThresholdParams operator()(
25         const std::vector<discrete::LabeledThresholdParam>& arg) const;
26 };
27 
28 SensorsInfo fromLabeledSensorsInfo(const std::vector<LabeledSensorInfo>& infos);
29 
30 TriggerThresholdParams
31     fromLabeledThresholdParam(const std::vector<LabeledThresholdParam>& params);
32 
33 nlohmann::json labeledThresholdParamsToJson(
34     const LabeledTriggerThresholdParams& labeledThresholdParams);
35 
36 template <typename T>
37 struct is_variant : std::false_type
38 {};
39 
40 template <typename... Args>
41 struct is_variant<std::variant<Args...>> : std::true_type
42 {};
43 
44 template <typename T>
45 inline constexpr bool is_variant_v = is_variant<T>::value;
46 
47 template <typename AlternativeT, typename VariantT>
48     requires is_variant_v<VariantT>
isFirstElementOfType(const std::vector<VariantT> & collection)49 bool isFirstElementOfType(const std::vector<VariantT>& collection)
50 {
51     if (collection.empty())
52     {
53         return false;
54     }
55     return std::holds_alternative<AlternativeT>(*collection.begin());
56 }
57 
58 double stodStrict(const std::string& str);
59 
60 } // namespace utils
61