blob: 92fdb70523fd9a8eceacf13f8819c0efb5928549 [file] [log] [blame]
/**
* Copyright © 2022 IBM Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include "config_base.hpp"
#include <string>
#include <vector>
namespace phosphor::fan::control::json
{
using json = nlohmann::json;
/**
* @class Modifier
*
* This class provides a doOp() function to modify a PropertyVariantType value
* based on a JSON config passed into its constructor.
*
* For example, with the JSON:
* {
* "operator": "minus",
* "value": 3
* }
*
* When doOp() is called, it will subtract 3 from the value passed
* into doOp() and return the result.
*
* The valid operators are:
* - "minus"
* - "less_than"
*
* To add a new operator, derive a new class from BaseOperator and
* then create it accordingly in setOperator.
*/
class Modifier
{
public:
/**
* @brief Base class for operators
*/
struct BaseOperator
{
virtual ~BaseOperator() = default;
virtual PropertyVariantType operator()(double val) = 0;
virtual PropertyVariantType operator()(int32_t val) = 0;
virtual PropertyVariantType operator()(int64_t val) = 0;
virtual PropertyVariantType operator()(const std::string& val) = 0;
virtual PropertyVariantType operator()(bool val) = 0;
};
Modifier() = delete;
~Modifier() = default;
Modifier(const Modifier&) = delete;
Modifier& operator=(const Modifier&) = delete;
Modifier(Modifier&&) = delete;
Modifier& operator=(Modifier&&) = delete;
/**
* @brief Constructor
*
* @param[in] jsonObj - The JSON config object
*/
explicit Modifier(const json& jsonObj);
/**
* @brief Performs the operation
*
* @param[in] value - The variant to do the operation on
*
* @return PropertyVariantType - The result
*/
PropertyVariantType doOp(const PropertyVariantType& value);
private:
/**
* @brief Parse and set the value
*
* @param[in] jsonObj - The JSON config object
*/
void setValue(const json& jsonObj);
/**
* @brief Parse and set the operator
*
* @param[in] jsonObj - The JSON config object
*/
void setOperator(const json& jsonObj);
/** @brief The value used by the operator */
PropertyVariantType _value;
/** @brief The operator that will be used */
std::unique_ptr<BaseOperator> _operator;
};
} // namespace phosphor::fan::control::json