algocline_app/service/
init.rs1use 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 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}