use std::path::PathBuf; use tokio::fs; use crate::helpers::FILE_EXTENSION; use crate::types::MagmaProjectConfig; pub(crate) struct ProjectInitializer { name: String, path: PathBuf, } impl ProjectInitializer { pub fn new(name: Option, path: Option) -> color_eyre::Result { let project_path = path.unwrap_or(std::env::current_dir()?); let project_name = name.unwrap_or( project_path. file_name() .and_then(|n|n.to_str()) .unwrap_or("magma-project") .to_string() ); Ok(Self { name: project_name, path: project_path }) } pub async fn init(&self) -> color_eyre::Result<()> { if !self.path.exists() { fs::create_dir_all(&self.path).await?; } let magma_file = self.path.join(format!(".{}", FILE_EXTENSION)); let magma_config = MagmaProjectConfig::default(); fs::write(&magma_file, toml::to_string(&magma_config)?).await?; let src_dir = self.path.join("src"); fs::create_dir_all(&src_dir).await?; let main_file = src_dir.join(format!("main.{}", FILE_EXTENSION)); fs::write(&main_file, include_str!("../../assets/main.mg")).await?; println!("✓ Initialized magma project: {}", self.name); println!("\tLocation: {}", self.path.display()); println!("\tCreated:"); println!("\t\t- .mg"); println!("\t\t- src/"); println!("\t\t- src/main.mg"); Ok(()) } }