Skip to main content

algocline_app/service/
init.rs

1//! `alc_init` — initialize `alc.toml` in a project root.
2
3use super::alc_toml::{alc_toml_path, save_alc_toml};
4use super::project::resolve_project_root;
5use super::AppService;
6
7impl AppService {
8    pub async fn init(&self, project_root: Option<String>) -> Result<String, String> {
9        // resolve: explicit → ALC_PROJECT_ROOT → walk_up (None if alc.toml absent) → cwd
10        let root = match resolve_project_root(project_root.as_deref()) {
11            Some(r) => r,
12            None => std::env::current_dir().map_err(|e| format!("Cannot determine cwd: {e}"))?,
13        };
14
15        let path = alc_toml_path(&root);
16        if path.exists() {
17            return Err(format!("alc.toml already exists at {}", path.display()));
18        }
19
20        let doc: toml_edit::DocumentMut = "[packages]\n"
21            .parse()
22            .map_err(|e: toml_edit::TomlError| format!("Internal error: {e}"))?;
23        save_alc_toml(&root, &doc)?;
24
25        let result = serde_json::json!({ "created": path.display().to_string() });
26        Ok(result.to_string())
27    }
28}
29
30#[cfg(test)]
31mod tests {
32    use crate::service::test_support::make_app_service as make_service;
33
34    #[tokio::test]
35    async fn init_creates_alc_toml() {
36        let tmp = tempfile::tempdir().unwrap();
37        let svc = make_service().await;
38        let result = svc
39            .init(Some(tmp.path().to_str().unwrap().to_string()))
40            .await
41            .unwrap();
42        assert!(result.contains("created"));
43        assert!(tmp.path().join("alc.toml").exists());
44
45        let content = std::fs::read_to_string(tmp.path().join("alc.toml")).unwrap();
46        assert!(content.contains("[packages]"));
47    }
48
49    #[tokio::test]
50    async fn init_fails_if_alc_toml_exists() {
51        let tmp = tempfile::tempdir().unwrap();
52        std::fs::write(tmp.path().join("alc.toml"), "[packages]\n").unwrap();
53        let svc = make_service().await;
54        let err = svc
55            .init(Some(tmp.path().to_str().unwrap().to_string()))
56            .await
57            .unwrap_err();
58        assert!(err.contains("already exists"));
59    }
60}