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}