mongo_embedded/
lib.rs

1pub mod downloader;
2pub mod extractor;
3pub mod process;
4
5use anyhow::Result;
6use std::path::PathBuf;
7use directories::ProjectDirs;
8
9use crate::downloader::{get_download_url, download_file, get_os};
10use crate::extractor::extract;
11use crate::process::MongoProcess;
12
13pub struct MongoEmbedded {
14    pub version: String,
15    pub download_path: PathBuf,
16    pub extract_path: PathBuf,
17    pub db_path: PathBuf,
18    pub port: u16,
19}
20
21impl MongoEmbedded {
22    pub fn new(version: &str) -> Result<Self> {
23        let proj_dirs = ProjectDirs::from("com", "mongo", "embedded")
24            .ok_or_else(|| anyhow::anyhow!("Could not determine project directories"))?;
25        
26        let cache_dir = proj_dirs.cache_dir();
27        let data_dir = proj_dirs.data_dir();
28
29        Ok(Self {
30            version: version.to_string(),
31            download_path: cache_dir.join("downloads"),
32            extract_path: cache_dir.join("extracted"),
33            db_path: data_dir.join("db"),
34            port: 27017,
35        })
36    }
37
38    pub fn set_port(mut self, port: u16) -> Self {
39        self.port = port;
40        self
41    }
42
43    pub fn set_db_path(mut self, path: PathBuf) -> Self {
44        self.db_path = path;
45        self
46    }
47
48    pub async fn start(&self) -> Result<MongoProcess> {
49        let mongo_url = get_download_url(&self.version)?;
50        let download_target = self.download_path.join(&mongo_url.filename);
51
52        if !download_target.exists() {
53            if !self.download_path.exists() {
54                std::fs::create_dir_all(&self.download_path)?;
55            }
56            // println!("Downloading MongoDB from {}", mongo_url.url);
57            download_file(&mongo_url.url, &download_target).await?;
58        }
59
60        let extract_target = self.extract_path.join(self.version.as_str());
61        if !extract_target.exists() {
62            // println!("Extracting MongoDB to {:?}", extract_target);
63            extract(&download_target, &extract_target)?;
64        }
65
66        let os = get_os()?;
67        
68        // println!("Starting MongoDB on port {}", self.port);
69        MongoProcess::start(&extract_target, self.port, &self.db_path, &os)
70    }
71}