#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Method {
Handshake,
WidgetTree,
WidgetProps,
FrameStatsSubscribe,
FrameStats,
MetricsSnapshot,
InputTap,
InputScroll,
InputText,
Screenshot,
}
impl Method {
pub fn as_str(self) -> &'static str {
match self {
Method::Handshake => "handshake",
Method::WidgetTree => "widget_tree",
Method::WidgetProps => "widget_props",
Method::FrameStatsSubscribe => "frame_stats_subscribe",
Method::FrameStats => "frame_stats",
Method::MetricsSnapshot => "metrics_snapshot",
Method::InputTap => "input_tap",
Method::InputScroll => "input_scroll",
Method::InputText => "input_text",
Method::Screenshot => "screenshot",
}
}
#[allow(clippy::should_implement_trait)]
pub fn from_str(s: &str) -> Option<Method> {
Some(match s {
"handshake" => Method::Handshake,
"widget_tree" => Method::WidgetTree,
"widget_props" => Method::WidgetProps,
"frame_stats_subscribe" => Method::FrameStatsSubscribe,
"frame_stats" => Method::FrameStats,
"metrics_snapshot" => Method::MetricsSnapshot,
"input_tap" => Method::InputTap,
"input_scroll" => Method::InputScroll,
"input_text" => Method::InputText,
"screenshot" => Method::Screenshot,
_ => return None,
})
}
}
impl std::fmt::Display for Method {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[cfg(test)]
mod tests {
use super::*;
const ALL: [Method; 10] = [
Method::Handshake,
Method::WidgetTree,
Method::WidgetProps,
Method::FrameStatsSubscribe,
Method::FrameStats,
Method::MetricsSnapshot,
Method::InputTap,
Method::InputScroll,
Method::InputText,
Method::Screenshot,
];
#[test]
fn as_str_from_str_round_trips_every_v1_method() {
for m in ALL {
assert_eq!(Method::from_str(m.as_str()), Some(m));
}
}
#[test]
fn from_str_rejects_unknown_method() {
assert_eq!(Method::from_str("not_a_real_method"), None);
}
#[test]
fn display_matches_as_str() {
assert_eq!(Method::Handshake.to_string(), "handshake");
}
}