| #ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_CONDITION_H_ |
| #define PRODUCTION_SUSHID_SAFEPOWER_AGENT_CONDITION_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <tuple> |
| #include <vector> |
| |
| #include "safepower_agent.pb.h" |
| #include "state_updater.h" |
| #include "absl/base/nullability.h" |
| #include "absl/functional/any_invocable.h" |
| #include "absl/status/status.h" |
| #include "absl/strings/string_view.h" |
| #include "absl/time/time.h" |
| #include "google/protobuf/repeated_ptr_field.h" |
| |
| namespace safepower_agent { |
| |
| class Condition { |
| class Listener |
| : public StateUpdater<safepower_agent_proto::SystemState>::Listener { |
| public: |
| explicit Listener(Condition& condition) : condition_(condition) {} |
| void UpdateState(const safepower_agent_proto::SystemState& current_state, |
| const safepower_agent_proto::SystemState& update) override; |
| void Done() override {} |
| |
| private: |
| Condition& condition_; |
| }; |
| |
| public: |
| explicit Condition(const safepower_agent_proto::Condition& condition, |
| absl::Time original_start_time); |
| ~Condition(); |
| |
| using MatchList = |
| std::vector<absl::Nonnull<const safepower_agent_proto::Condition*>>; |
| |
| absl::Status WaitForMatch( |
| absl::string_view unique_id, |
| absl::Nonnull< |
| std::shared_ptr<StateUpdater<safepower_agent_proto::SystemState>>> |
| state_updater, |
| absl::AnyInvocable<void(absl::Status, MatchList matches) &&> callback); |
| std::tuple<absl::Status, MatchList> CheckState( |
| const safepower_agent_proto::SystemState& state); |
| |
| absl::Status TriggerCallback(absl::Status match_status, MatchList match_list); |
| |
| bool active() const { return callback_ != nullptr; } |
| |
| private: |
| void ExecuteCallback(absl::Status match_status, MatchList match_list); |
| absl::Status RegisterTimeouts( |
| const safepower_agent_proto::Condition& condition, |
| absl::string_view job_name_prefix); |
| absl::Status RegisterTimeouts( |
| const google::protobuf::RepeatedPtrField<safepower_agent_proto::Condition>& |
| conditions, |
| absl::string_view job_name_prefix); |
| |
| Listener listener_; |
| std::string complete_job_name_; |
| const safepower_agent_proto::Condition& condition_; |
| std::vector<std::string> pending_jobs_; |
| absl::Time start_time_; |
| absl::AnyInvocable<void(absl::Status, MatchList matches) &&> callback_; |
| std::shared_ptr<StateUpdater<safepower_agent_proto::SystemState>> |
| state_updater_; |
| }; |
| |
| } // namespace safepower_agent |
| |
| #endif // PRODUCTION_SUSHID_SAFEPOWER_AGENT_CONDITION_H_ |