⭐️ A friendly language for building type-safe, scalable systems!
at main 1.6 kB view raw
1use gleam_core::{ 2 analyse::TargetSupport, 3 build::{Codegen, Compile, Mode, Options, Target}, 4 error::{Error, ShellCommandFailureReason}, 5 paths::ProjectPaths, 6}; 7use std::process::Command; 8 9pub fn command(paths: &ProjectPaths) -> Result<(), Error> { 10 // Build project 11 let _ = crate::build::main( 12 paths, 13 Options { 14 root_target_support: TargetSupport::Enforced, 15 warnings_as_errors: false, 16 codegen: Codegen::All, 17 compile: Compile::All, 18 mode: Mode::Dev, 19 target: Some(Target::Erlang), 20 no_print_progress: false, 21 }, 22 crate::build::download_dependencies(paths, crate::cli::Reporter::new())?, 23 )?; 24 25 // Don't exit on ctrl+c as it is used by child erlang shell 26 ctrlc::set_handler(move || {}).expect("Error setting Ctrl-C handler"); 27 28 // Prepare the Erlang shell command 29 let mut command = Command::new("erl"); 30 31 // Print character lists as lists 32 let _ = command.arg("-stdlib").arg("shell_strings").arg("false"); 33 34 // Specify locations of .beam files 35 let packages = paths.build_directory_for_target(Mode::Dev, Target::Erlang); 36 for entry in crate::fs::read_dir(packages)?.filter_map(Result::ok) { 37 let _ = command.arg("-pa").arg(entry.path().join("ebin")); 38 } 39 40 crate::cli::print_running("Erlang shell"); 41 42 // Run the shell 43 tracing::info!("Running OS process {:?}", command); 44 let _ = command.status().map_err(|e| Error::ShellCommand { 45 program: "erl".into(), 46 reason: ShellCommandFailureReason::IoError(e.kind()), 47 })?; 48 Ok(()) 49}