rust_crate_src_mcp/
lib.rs1pub 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}