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}