Files
magma-mc/src/cli/project_initializer.rs
2026-02-07 20:36:00 +08:00

46 lines
1.5 KiB
Rust

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<String>, path: Option<PathBuf>) -> color_eyre::Result<Self> {
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(())
}
}