use super::{LaunchError, LaunchPlan, LaunchRecipe, ProxyEndpoint};
pub const ANTHROPIC_BASE_URL_ENV: &str = "ANTHROPIC_BASE_URL";
const HARNESS_ID: &str = crate::harness::CLAUDE.id();
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ClaudeRecipe {
endpoint: ProxyEndpoint,
}
impl ClaudeRecipe {
pub fn new(endpoint: ProxyEndpoint) -> Self {
Self { endpoint }
}
}
impl LaunchRecipe for ClaudeRecipe {
fn harness(&self) -> &str {
HARNESS_ID
}
fn plan(&self) -> Result<LaunchPlan, LaunchError> {
Ok(LaunchPlan {
args: Vec::new(),
env: vec![(
ANTHROPIC_BASE_URL_ENV.to_string(),
self.endpoint.as_str().to_string(),
)],
config_files: Vec::new(),
})
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
#[test]
fn plan_sets_anthropic_base_url_and_nothing_else() {
let recipe = ClaudeRecipe::new(ProxyEndpoint::new(
"127.0.0.1:51539/v1/anthropic/anthropic-transparent",
));
let plan = recipe.plan().unwrap();
assert_eq!(
plan.env,
vec![(
"ANTHROPIC_BASE_URL".to_string(),
"http://127.0.0.1:51539/v1/anthropic/anthropic-transparent".to_string(),
)],
);
assert!(plan.args.is_empty(), "claude takes no config arguments");
assert!(plan.config_files.is_empty(), "claude needs no config file");
}
#[test]
fn plan_appends_no_route_segments() {
let recipe = ClaudeRecipe::new(ProxyEndpoint::new("http://localhost:8080"));
let plan = recipe.plan().unwrap();
assert_eq!(plan.env[0].1, "http://localhost:8080");
}
#[test]
fn harness_id_matches_the_envelope_value() {
let recipe = ClaudeRecipe::new(ProxyEndpoint::new("127.0.0.1:1"));
assert_eq!(recipe.harness(), tapes_capture::envelope::HARNESS_ID_CLAUDE);
assert_eq!(recipe.harness(), "claude");
}
}