46 lines
1.5 KiB
Rust
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(())
|
|
}
|
|
} |