1 /**
2  * Copyright © 2019 IBM Corporation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #include "action.hpp"
19 #include "action_environment.hpp"
20 
21 #include <memory>
22 #include <string>
23 #include <utility>
24 #include <vector>
25 
26 namespace phosphor::power::regulators
27 {
28 
29 /**
30  * @class AndAction
31  *
32  * Executes a sequence of actions and tests whether all of them returned true.
33  *
34  * Implements the "and" action in the JSON config file.
35  */
36 class AndAction : public Action
37 {
38   public:
39     // Specify which compiler-generated methods we want
40     AndAction() = delete;
41     AndAction(const AndAction&) = delete;
42     AndAction(AndAction&&) = delete;
43     AndAction& operator=(const AndAction&) = delete;
44     AndAction& operator=(AndAction&&) = delete;
45     virtual ~AndAction() = default;
46 
47     /**
48      * Constructor.
49      *
50      * @param actions actions to execute
51      */
52     explicit AndAction(std::vector<std::unique_ptr<Action>> actions) :
53         actions{std::move(actions)}
54     {
55     }
56 
57     /**
58      * Executes the actions specified in the constructor.
59      *
60      * Returns true if all of the actions returned true, otherwise returns
61      * false.
62      *
63      * Note: All of the actions will be executed even if an action before the
64      * end returns false.  This ensures that actions with beneficial
65      * side-effects are always executed, such as a register read that clears
66      * latched fault bits.
67      *
68      * Throws an exception if an error occurs and an action cannot be
69      * successfully executed.
70      *
71      * @param environment action execution environment
72      * @return true if all actions returned true, otherwise returns false
73      */
74     virtual bool execute(ActionEnvironment& environment) override
75     {
76         bool returnValue{true};
77         for (std::unique_ptr<Action>& action : actions)
78         {
79             if (action->execute(environment) == false)
80             {
81                 returnValue = false;
82             }
83         }
84         return returnValue;
85     }
86 
87     /**
88      * Returns the actions to execute.
89      *
90      * @return actions to execute
91      */
92     const std::vector<std::unique_ptr<Action>>& getActions() const
93     {
94         return actions;
95     }
96 
97     /**
98      * Returns a string description of this action.
99      *
100      * @return description of action
101      */
102     virtual std::string toString() const override
103     {
104         return "and: [ ... ]";
105     }
106 
107   private:
108     /**
109      * Actions to execute.
110      */
111     std::vector<std::unique_ptr<Action>> actions{};
112 };
113 
114 } // namespace phosphor::power::regulators
115