/** * Copyright © 2019 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 "action.hpp" #include "action_environment.hpp" #include #include #include #include namespace phosphor::power::regulators { /** * @class IfAction * * Performs actions based on whether a condition is true. * * Implements the "if" action in the JSON config file. The "if" action provides * a standard if/then/else structure within the JSON config file. * * The "if" action contains three parts: * - condition * - then clause * - else clause (optional) * * The condition is a single action. The action is executed to determine if the * condition is true. * * If the condition is true, the actions in the "then" clause are executed. * * If the condition is false, the actions in the "else" clause are executed (if * specified). */ class IfAction : public Action { public: // Specify which compiler-generated methods we want IfAction() = delete; IfAction(const IfAction&) = delete; IfAction(IfAction&&) = delete; IfAction& operator=(const IfAction&) = delete; IfAction& operator=(IfAction&&) = delete; virtual ~IfAction() = default; /** * Constructor. * * @param conditionAction action that tests whether condition is true * @param thenActions actions to perform if condition is true * @param elseActions actions to perform if condition is false (optional) */ explicit IfAction(std::unique_ptr conditionAction, std::vector> thenActions, std::vector> elseActions = std::vector>{}) : conditionAction{std::move(conditionAction)}, thenActions{std::move(thenActions)}, elseActions{std::move(elseActions)} { } /** * Executes the condition action specified in the constructor. * * If the condition action returns true, the actions in the "then" clause * will be executed. Returns the return value of the last action in the * "then" clause. * * If the condition action returns false, the actions in the "else" clause * will be executed. Returns the return value of the last action in the * "else" clause. If no "else" clause was specified, returns false. * * Throws an exception if an error occurs and an action cannot be * successfully executed. * * @param environment action execution environment * @return return value from last action in "then" or "else" clause */ virtual bool execute(ActionEnvironment& environment) override; /** * Returns the action that tests whether the condition is true. * * @return condition action */ const std::unique_ptr& getConditionAction() const { return conditionAction; } /** * Returns the actions in the "then" clause. * * These actions are executed if the condition is true. * * @return then clause actions */ const std::vector>& getThenActions() const { return thenActions; } /** * Returns the actions in the "else" clause. * * These actions are executed if the condition is false. * * @return else clause actions */ const std::vector>& getElseActions() const { return elseActions; } /** * Returns a string description of this action. * * @return description of action */ virtual std::string toString() const override { std::string description{"if: { condition: { ... }, then: [ ... ]"}; if (elseActions.size() > 0) { description += ", else: [ ... ]"; } description += " }"; return description; } private: /** * Action that tests whether the condition is true. */ std::unique_ptr conditionAction{}; /** * Actions in the "then" clause. Executed if condition is true. */ std::vector> thenActions{}; /** * Actions in the "else" clause. Executed if condition is false. Optional. */ std::vector> elseActions{}; }; } // namespace phosphor::power::regulators