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