agtrace_testing/
providers.rs

1//! Provider definitions for testing logic.
2//!
3//! This module provides type-safe provider handling for tests,
4//! abstracting away provider-specific directory structures and
5//! configuration details.
6
7/// Supported test providers.
8///
9/// Each variant represents a different AI agent provider that agtrace supports.
10#[derive(Debug, Clone, Copy, PartialEq, Eq)]
11pub enum TestProvider {
12    /// Claude Code provider
13    Claude,
14    /// Gemini provider
15    Gemini,
16    /// Codex provider
17    Codex,
18}
19
20impl TestProvider {
21    /// Get the provider name as used in config.toml and CLI.
22    ///
23    /// # Example
24    /// ```
25    /// # use agtrace_testing::providers::TestProvider;
26    /// assert_eq!(TestProvider::Claude.name(), "claude_code");
27    /// assert_eq!(TestProvider::Gemini.name(), "gemini");
28    /// ```
29    pub fn name(&self) -> &'static str {
30        match self {
31            TestProvider::Claude => "claude_code",
32            TestProvider::Gemini => "gemini",
33            TestProvider::Codex => "codex",
34        }
35    }
36
37    /// Create a provider adapter for this test provider.
38    ///
39    /// This allows access to provider-specific logic like directory encoding.
40    pub fn adapter(&self) -> agtrace_providers::ProviderAdapter {
41        match self {
42            TestProvider::Claude => agtrace_providers::ProviderAdapter::claude(),
43            TestProvider::Gemini => agtrace_providers::ProviderAdapter::gemini(),
44            TestProvider::Codex => agtrace_providers::ProviderAdapter::codex(),
45        }
46    }
47
48    /// Get the default log directory name for this provider.
49    ///
50    /// This is the directory name relative to the temp root where
51    /// the provider's logs are stored (e.g., `.claude`, `.gemini`).
52    pub fn default_log_dir_name(&self) -> &'static str {
53        match self {
54            TestProvider::Claude => ".claude",
55            TestProvider::Gemini => ".gemini",
56            TestProvider::Codex => ".codex",
57        }
58    }
59
60    /// Get the sample filename for this provider.
61    ///
62    /// Returns the filename in the samples directory that contains
63    /// example data for this provider.
64    pub fn sample_filename(&self) -> &'static str {
65        match self {
66            TestProvider::Claude => "claude_session.jsonl",
67            TestProvider::Gemini => "gemini_session.json",
68            TestProvider::Codex => "codex_session.jsonl",
69        }
70    }
71
72    /// Get all supported providers.
73    pub fn all() -> &'static [TestProvider] {
74        &[
75            TestProvider::Claude,
76            TestProvider::Gemini,
77            TestProvider::Codex,
78        ]
79    }
80}
81
82impl std::fmt::Display for TestProvider {
83    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
84        write!(f, "{}", self.name())
85    }
86}