use serde::Deserialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum JsonParserType {
#[default]
Claude,
Codex,
Gemini,
OpenCode,
Generic,
}
impl JsonParserType {
#[must_use]
pub fn parse(s: &str) -> Self {
match s.to_lowercase().as_str() {
"claude" | "ccs" => Self::Claude,
"codex" => Self::Codex,
"gemini" => Self::Gemini,
"opencode" => Self::OpenCode,
_ => Self::Generic,
}
}
}
impl std::fmt::Display for JsonParserType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Claude => write!(f, "claude"),
Self::Codex => write!(f, "codex"),
Self::Gemini => write!(f, "gemini"),
Self::OpenCode => write!(f, "opencode"),
Self::Generic => write!(f, "generic"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_json_parser_type_parse() {
assert_eq!(JsonParserType::parse("claude"), JsonParserType::Claude);
assert_eq!(JsonParserType::parse("CLAUDE"), JsonParserType::Claude);
assert_eq!(JsonParserType::parse("ccs"), JsonParserType::Claude);
assert_eq!(JsonParserType::parse("CCS"), JsonParserType::Claude);
assert_eq!(JsonParserType::parse("codex"), JsonParserType::Codex);
assert_eq!(JsonParserType::parse("gemini"), JsonParserType::Gemini);
assert_eq!(JsonParserType::parse("GEMINI"), JsonParserType::Gemini);
assert_eq!(JsonParserType::parse("opencode"), JsonParserType::OpenCode);
assert_eq!(JsonParserType::parse("OPENCODE"), JsonParserType::OpenCode);
assert_eq!(JsonParserType::parse("generic"), JsonParserType::Generic);
assert_eq!(JsonParserType::parse("none"), JsonParserType::Generic);
assert_eq!(JsonParserType::parse("raw"), JsonParserType::Generic);
assert_eq!(JsonParserType::parse("unknown"), JsonParserType::Generic);
}
#[test]
fn test_json_parser_type_display() {
assert_eq!(format!("{}", JsonParserType::Claude), "claude");
assert_eq!(format!("{}", JsonParserType::Codex), "codex");
assert_eq!(format!("{}", JsonParserType::Gemini), "gemini");
assert_eq!(format!("{}", JsonParserType::OpenCode), "opencode");
assert_eq!(format!("{}", JsonParserType::Generic), "generic");
}
}