blob: 7177ced109619475ce91ad7d6bbf7272d1a07a90 [file] [log] [blame]
#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_