12134ca66SShawn McCarney /** 22134ca66SShawn McCarney * Copyright © 2019 IBM Corporation 32134ca66SShawn McCarney * 42134ca66SShawn McCarney * Licensed under the Apache License, Version 2.0 (the "License"); 52134ca66SShawn McCarney * you may not use this file except in compliance with the License. 62134ca66SShawn McCarney * You may obtain a copy of the License at 72134ca66SShawn McCarney * 82134ca66SShawn McCarney * http://www.apache.org/licenses/LICENSE-2.0 92134ca66SShawn McCarney * 102134ca66SShawn McCarney * Unless required by applicable law or agreed to in writing, software 112134ca66SShawn McCarney * distributed under the License is distributed on an "AS IS" BASIS, 122134ca66SShawn McCarney * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132134ca66SShawn McCarney * See the License for the specific language governing permissions and 142134ca66SShawn McCarney * limitations under the License. 152134ca66SShawn McCarney */ 162134ca66SShawn McCarney #pragma once 172134ca66SShawn McCarney 182134ca66SShawn McCarney #include "action.hpp" 192134ca66SShawn McCarney #include "action_environment.hpp" 202134ca66SShawn McCarney #include "rule.hpp" 212134ca66SShawn McCarney 222134ca66SShawn McCarney #include <string> 232134ca66SShawn McCarney 242134ca66SShawn McCarney namespace phosphor::power::regulators 252134ca66SShawn McCarney { 262134ca66SShawn McCarney 272134ca66SShawn McCarney /** 282134ca66SShawn McCarney * @class RunRuleAction 292134ca66SShawn McCarney * 302134ca66SShawn McCarney * Runs the specified rule. 312134ca66SShawn McCarney * 322134ca66SShawn McCarney * Implements the run_rule action in the JSON config file. 332134ca66SShawn McCarney */ 342134ca66SShawn McCarney class RunRuleAction : public Action 352134ca66SShawn McCarney { 362134ca66SShawn McCarney public: 372134ca66SShawn McCarney // Specify which compiler-generated methods we want 382134ca66SShawn McCarney RunRuleAction() = delete; 392134ca66SShawn McCarney RunRuleAction(const RunRuleAction&) = delete; 402134ca66SShawn McCarney RunRuleAction(RunRuleAction&&) = delete; 412134ca66SShawn McCarney RunRuleAction& operator=(const RunRuleAction&) = delete; 422134ca66SShawn McCarney RunRuleAction& operator=(RunRuleAction&&) = delete; 432134ca66SShawn McCarney virtual ~RunRuleAction() = default; 442134ca66SShawn McCarney 452134ca66SShawn McCarney /** 462134ca66SShawn McCarney * Constructor. 472134ca66SShawn McCarney * 482134ca66SShawn McCarney * @param ruleID rule ID 492134ca66SShawn McCarney */ RunRuleAction(const std::string & ruleID)50*48781aefSPatrick Williams explicit RunRuleAction(const std::string& ruleID) : ruleID{ruleID} {} 512134ca66SShawn McCarney 522134ca66SShawn McCarney /** 532134ca66SShawn McCarney * Executes this action. 542134ca66SShawn McCarney * 552134ca66SShawn McCarney * Runs the rule specified in the constructor. 562134ca66SShawn McCarney * 572134ca66SShawn McCarney * Returns the return value from the last action in the rule. 582134ca66SShawn McCarney * 592134ca66SShawn McCarney * Throws an exception if an error occurs and an action cannot be 602134ca66SShawn McCarney * successfully executed. 612134ca66SShawn McCarney * 622134ca66SShawn McCarney * @param environment action execution environment 632134ca66SShawn McCarney * @return return value from last action in rule 642134ca66SShawn McCarney */ execute(ActionEnvironment & environment)652134ca66SShawn McCarney virtual bool execute(ActionEnvironment& environment) override 662134ca66SShawn McCarney { 672134ca66SShawn McCarney // Increment rule call stack depth since we are running a rule. Rule 682134ca66SShawn McCarney // depth is used to detect infinite recursion. 692134ca66SShawn McCarney environment.incrementRuleDepth(ruleID); 702134ca66SShawn McCarney 712134ca66SShawn McCarney // Execute rule 722134ca66SShawn McCarney bool returnValue = environment.getRule(ruleID).execute(environment); 732134ca66SShawn McCarney 742134ca66SShawn McCarney // Decrement rule depth since rule has returned 752134ca66SShawn McCarney environment.decrementRuleDepth(); 762134ca66SShawn McCarney 772134ca66SShawn McCarney return returnValue; 782134ca66SShawn McCarney } 792134ca66SShawn McCarney 802134ca66SShawn McCarney /** 812134ca66SShawn McCarney * Returns the rule ID. 822134ca66SShawn McCarney * 832134ca66SShawn McCarney * @return rule ID 842134ca66SShawn McCarney */ getRuleID() const852134ca66SShawn McCarney const std::string& getRuleID() const 862134ca66SShawn McCarney { 872134ca66SShawn McCarney return ruleID; 882134ca66SShawn McCarney } 892134ca66SShawn McCarney 908a3db36aSShawn McCarney /** 918a3db36aSShawn McCarney * Returns a string description of this action. 928a3db36aSShawn McCarney * 938a3db36aSShawn McCarney * @return description of action 948a3db36aSShawn McCarney */ toString() const958a3db36aSShawn McCarney virtual std::string toString() const override 968a3db36aSShawn McCarney { 978a3db36aSShawn McCarney return "run_rule: " + ruleID; 988a3db36aSShawn McCarney } 998a3db36aSShawn McCarney 1002134ca66SShawn McCarney private: 1012134ca66SShawn McCarney /** 1022134ca66SShawn McCarney * Rule ID. 1032134ca66SShawn McCarney */ 1042134ca66SShawn McCarney const std::string ruleID{}; 1052134ca66SShawn McCarney }; 1062134ca66SShawn McCarney 1072134ca66SShawn McCarney } // namespace phosphor::power::regulators 108