blob: 707a4e55360f689279eb03d466d5f588d641d6c8 [file] [log] [blame]
#ifndef PRODUCTION_SUSHID_SAFEPOWER_AGENT_STATE_FIELDS_H_
#define PRODUCTION_SUSHID_SAFEPOWER_AGENT_STATE_FIELDS_H_
#include <string>
#include <tuple>
#include "safepower_agent.pb.h"
#include "absl/strings/string_view.h"
namespace safepower_agent {
template <typename Proto, typename FieldT>
class FieldDef {
public:
explicit constexpr FieldDef(FieldT (Proto::*get)() const,
bool (Proto::*has)() const,
void (Proto::*set)(FieldT))
: get_(get), has_(has), set_(set) {}
FieldT get_from(const Proto& proto) const { return (proto.*get_)(); }
bool is_in(const Proto& proto) const { return (proto.*has_)(); }
void set_in(Proto& proto, FieldT value) const { (proto.*set_)(value); }
private:
FieldT (Proto::*get_)() const;
bool (Proto::*has_)() const;
void (Proto::*set_)(FieldT);
};
template <typename Proto, typename FieldT>
FieldDef(FieldT (Proto::*get)() const, bool (Proto::*has)() const,
void (Proto::*set)(FieldT)) -> FieldDef<Proto, FieldT>;
template <typename Proto>
class FieldDef<Proto, std::string> {
public:
explicit constexpr FieldDef(const std::string& (Proto::*get)() const,
bool (Proto::*has)() const,
void (Proto::*set)(const std::string&))
: get_(get), has_(has), set_(set) {}
const std::string& get_from(const Proto& proto) const {
return (proto.*get_)();
}
bool is_in(const Proto& proto) const { return (proto.*has_)(); }
void set_in(Proto& proto, absl::string_view value) const {
(proto.*set_)(value);
}
private:
const std::string& (Proto::*get_)() const;
bool (Proto::*has_)() const;
void (Proto::*set_)(const std::string&);
};
template <typename Proto>
struct ProtoFields {
// static constexpr std::tuple kFields; is not defined here so we have a
// compiler error if we forget to define it for some type.
};
#define FIELD_DEF(Proto, field_name) \
FieldDef(&Proto::field_name, &Proto::has_##field_name, \
&Proto::set_##field_name)
// LINT.IfChange(ComponentStateFields)
template <>
struct ProtoFields<safepower_agent_proto::DaemonState> {
static constexpr std::tuple kFields = {
FIELD_DEF(safepower_agent_proto::DaemonState, healthy),
FIELD_DEF(safepower_agent_proto::DaemonState, restart_counter),
};
};
template <>
struct ProtoFields<safepower_agent_proto::BootState> {
static constexpr std::tuple kFields = {
FIELD_DEF(safepower_agent_proto::BootState, boot_counter),
FIELD_DEF(safepower_agent_proto::BootState, uptime_ms),
FIELD_DEF(safepower_agent_proto::BootState, state),
};
};
template <>
struct ProtoFields<safepower_agent_proto::ConnectionState> {
static constexpr std::tuple kFields = {
FIELD_DEF(safepower_agent_proto::ConnectionState, reconnect_counter),
};
};
template <>
struct ProtoFields<safepower_agent_proto::PowerState> {
static constexpr std::tuple kFields = {
FIELD_DEF(safepower_agent_proto::PowerState, state),
FIELD_DEF(safepower_agent_proto::PowerState, power_cycle_counter),
};
};
// LINT.ThenChange(//depot/proto/safepower_agent.proto:ComponentState)
#undef FIELD_DEF
} // namespace safepower_agent
#endif // PRODUCTION_SUSHID_SAFEPOWER_AGENT_STATE_FIELDS_H_