symposium_ferris/crate_sources/
mod.rs1use std::path::PathBuf;
4
5use crate::Result;
6
7mod cache;
8mod extraction;
9pub(crate) mod mcp;
10mod version;
11
12pub use cache::CacheManager;
13pub use extraction::CrateExtractor;
14pub use version::VersionResolver;
15
16#[derive(Debug, Clone)]
18pub struct FetchResult {
19 pub version: String,
21 pub path: PathBuf,
23}
24
25pub struct RustCrateFetch {
27 crate_name: String,
28 version_spec: Option<String>,
29 cwd: PathBuf,
30}
31
32impl RustCrateFetch {
33 pub fn new(name: &str, cwd: impl Into<PathBuf>) -> Self {
35 Self {
36 crate_name: name.to_string(),
37 version_spec: None,
38 cwd: cwd.into(),
39 }
40 }
41
42 pub fn version(mut self, version: &str) -> Self {
44 self.version_spec = Some(version.to_string());
45 self
46 }
47
48 pub async fn fetch(self) -> Result<FetchResult> {
50 let resolver = VersionResolver::new(self.cwd);
52 let version = resolver
53 .resolve_version(&self.crate_name, self.version_spec.as_deref())
54 .await?;
55
56 let cache_manager = CacheManager::new()?;
58 let extractor = CrateExtractor::new();
59
60 let path = cache_manager
61 .get_or_extract_crate(&self.crate_name, &version, &extractor)
62 .await?;
63
64 Ok(FetchResult { version, path })
65 }
66}