Files
dioxus/src/cli/init/mod.rs
T
2022-01-23 01:29:36 +08:00

61 lines
1.5 KiB
Rust

use std::{process::{Command, Stdio}, fs::File, path::PathBuf, io::Write};
use structopt::StructOpt;
use crate::{error::{Error, Result}, cargo};
/// Build the Rust WASM app and all of its assets.
#[derive(Clone, Debug, StructOpt)]
#[structopt(name = "init")]
pub struct Init {
/// Init project path
#[structopt(default_value = ".")]
path: String,
/// Template path
#[structopt(default_value = "default", long)]
template: String,
}
impl Init {
pub fn init(self) -> Result<()> {
log::info!("🔧 Start to init a new project '{}'.", self.path);
let project_path = PathBuf::from(&self.path);
let output = Command::new("cargo")
.arg("init")
.arg(&self.path)
.arg("--bin")
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.output()?
;
if !output.status.success() {
return Err(Error::CargoError("Cargo init failed".into()));
}
// get the template code
let template_str = match self.template {
_ => include_str!("../../template/default.rs"),
};
let main_rs_file = project_path.join("src").join("main.rs");
if !main_rs_file.is_file() {
return Err(Error::FailedToWrite);
}
let mut file = File::create(main_rs_file)?;
file.write_all(&template_str.as_bytes())?;
// log::info!("🎯 Project initialization completed.");
Ok(())
}
}