rust_crate_src_mcp/
lib.rs

1pub mod extract;
2pub mod version;
3
4use bon::Builder;
5use snafu::{ResultExt, Snafu};
6use std::path::PathBuf;
7
8#[derive(Debug, Clone, Builder)]
9#[non_exhaustive]
10#[builder(on(_, into))]
11pub struct CrateSource {
12    pub crate_name: String,
13    pub version: String,
14    pub checkout_path: PathBuf,
15    pub message: String,
16}
17
18pub async fn get_crate_source(
19    crate_name: &str,
20    version_req: Option<&str>,
21) -> Result<CrateSource, GetCrateSourceError> {
22    use get_crate_source_error::*;
23
24    let version = version::resolve_version(crate_name, version_req)
25        .await
26        .context(ResolveVersionSnafu)?;
27    let checkout_path = extract::extract_crate(crate_name, &version)
28        .await
29        .context(ExtractSnafu)?;
30    let message = format!(
31        "Crate '{}' version {} extracted to {}",
32        crate_name,
33        version,
34        checkout_path.display()
35    );
36
37    Ok(CrateSource::builder()
38        .crate_name(crate_name)
39        .version(version)
40        .checkout_path(checkout_path)
41        .message(message)
42        .build())
43}
44
45#[derive(Debug, Snafu)]
46#[snafu(module)]
47pub enum GetCrateSourceError {
48    #[snafu(display("failed to resolve version"))]
49    ResolveVersion {
50        source: version::ResolveVersionError,
51    },
52    #[snafu(display("failed to extract crate"))]
53    Extract { source: extract::ExtractError },
54}