op_primitives/components/
challenger.rs

1use std::fmt::Display;
2
3use enum_variants_strings::EnumVariantsStrings;
4use serde::{Deserialize, Serialize};
5use strum::EnumIter;
6
7/// Challenger Agent Implementations
8#[derive(
9    Default, Copy, Clone, PartialEq, EnumVariantsStrings, Deserialize, Serialize, EnumIter,
10)]
11#[serde(rename_all = "kebab-case")]
12#[enum_variants_strings_transform(transform = "kebab_case")]
13pub enum ChallengerAgent {
14    /// A Go implementation of the challenger agent
15    #[default]
16    OpChallengerGo,
17    /// A Rust implementation of the challenger agent
18    OpChallengerRust,
19}
20
21impl std::fmt::Debug for ChallengerAgent {
22    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23        write!(f, "{}", self.to_str())
24    }
25}
26
27impl std::str::FromStr for ChallengerAgent {
28    type Err = eyre::Report;
29
30    fn from_str(s: &str) -> Result<Self, Self::Err> {
31        if s == ChallengerAgent::OpChallengerGo.to_str() {
32            return Ok(ChallengerAgent::OpChallengerGo);
33        }
34        if s == ChallengerAgent::OpChallengerRust.to_str() {
35            return Ok(ChallengerAgent::OpChallengerRust);
36        }
37        eyre::bail!("Invalid challenger agent: {}", s)
38    }
39}
40
41impl Display for ChallengerAgent {
42    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43        write!(f, "{}", self.to_str())
44    }
45}
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50
51    #[test]
52    fn test_deserialize_string() {
53        assert_eq!(
54            serde_json::from_str::<ChallengerAgent>(r#""op-challenger-go""#).unwrap(),
55            ChallengerAgent::OpChallengerGo
56        );
57        assert_eq!(
58            serde_json::from_str::<ChallengerAgent>(r#""op-challenger-rust""#).unwrap(),
59            ChallengerAgent::OpChallengerRust
60        );
61    }
62
63    #[test]
64    fn test_debug_string() {
65        assert_eq!(
66            format!("{:?}", ChallengerAgent::OpChallengerGo),
67            "op-challenger-go"
68        );
69        assert_eq!(
70            format!("{:?}", ChallengerAgent::OpChallengerRust),
71            "op-challenger-rust"
72        );
73    }
74
75    #[test]
76    fn test_challenger_agent_from_str() {
77        assert_eq!(
78            "op-challenger-go".parse::<ChallengerAgent>().unwrap(),
79            ChallengerAgent::OpChallengerGo
80        );
81        assert_eq!(
82            "op-challenger-rust".parse::<ChallengerAgent>().unwrap(),
83            ChallengerAgent::OpChallengerRust
84        );
85        assert!("invalid".parse::<ChallengerAgent>().is_err());
86    }
87
88    #[test]
89    fn test_challenger_agent_display() {
90        assert_eq!(
91            format!("{}", ChallengerAgent::OpChallengerGo),
92            "op-challenger-go"
93        );
94        assert_eq!(
95            format!("{}", ChallengerAgent::OpChallengerRust),
96            "op-challenger-rust"
97        );
98    }
99}