// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license. use crate::args::InitFlags; use crate::deno_std; use deno_core::anyhow::Context; use deno_core::error::AnyError; use log::info; use std::io::Write; use std::path::Path; fn create_file( dir: &Path, filename: &str, content: &str, ) -> Result<(), AnyError> { let mut file = std::fs::OpenOptions::new() .write(true) .create_new(true) .open(dir.join(filename)) .with_context(|| format!("Failed to create {} file", filename))?; file.write_all(content.as_bytes())?; Ok(()) } pub async fn init_project(init_flags: InitFlags) -> Result<(), AnyError> { let cwd = std::env::current_dir().context("Can't read current working directory.")?; let dir = if let Some(dir) = &init_flags.dir { let dir = cwd.join(dir); std::fs::create_dir_all(&dir)?; dir } else { cwd }; let main_ts = include_str!("./templates/main.ts"); create_file(&dir, "main.ts", main_ts)?; let main_test_ts = include_str!("./templates/main_test.ts") .replace("{CURRENT_STD_URL}", deno_std::CURRENT_STD_URL.as_str()); create_file(&dir, "main_test.ts", &main_test_ts)?; info!("✅ Project initialized"); info!("Run these commands to get started"); if let Some(dir) = init_flags.dir { info!(" cd {}", dir); } info!(" deno run main.ts"); info!(" deno test"); Ok(()) }