1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
use std::env; use std::fs; use std::path::PathBuf; use std::process::Command; use anyhow::Result; use tinytemplate::TinyTemplate; use crate::config::{Context, Dependencies}; const BUILD_TEMPLATE: &'static str = include_str!("./templates/elixir/mix.exs.tmpl"); const SOURCE_TEMPLATE: &'static str = include_str!("./templates/elixir/parser.ex.tmpl"); fn generate_templates(deps: Dependencies) -> Result<Vec<(&'static str, String)>> { let mut template = TinyTemplate::new(); template.add_template("mix.exs", BUILD_TEMPLATE)?; template.add_template("parser.ex", SOURCE_TEMPLATE)?; let build_template = template .render("mix.exs", &Context { deps: deps.clone() }) .unwrap(); let source_template = template .render("parser.ex", &Context { deps }) .unwrap(); let mut templates = Vec::new(); templates.push(("mix.exs", build_template)); templates.push(("lib/parser.ex", source_template)); Ok(templates) } pub fn write_project(path: String, deps: Dependencies) -> Result<()> { println!("Generating mix project..."); let folder_path = PathBuf::from(path); let templates = generate_templates(deps.clone())?; let (build_path, build_template) = templates.get(0).unwrap(); let (source_path, source_template) = templates.get(1).unwrap(); fs::create_dir_all(folder_path.clone())?; env::set_current_dir(folder_path.clone())?; fs::write(build_path, build_template)?; fs::create_dir(PathBuf::from("lib"))?; fs::write(source_path, source_template)?; Ok(()) } pub fn run(shell: bool) -> Result<()> { let stdout = os_pipe::dup_stdout()?; let mut mix = Command::new("mix") .args(&["do", "deps.get,", "deps.compile"]) .stdout(stdout) .spawn()?; let _ = mix.wait(); if shell { let stdout = os_pipe::dup_stdout()?; let mut iex_command = Command::new("iex") .args(&["-S", "mix"]) .stdout(stdout) .stdin(os_pipe::dup_stdin().unwrap()) .spawn()?; let _ = iex_command.wait(); } Ok(()) }