diff --git a/crates/erg_common/config.rs b/crates/erg_common/config.rs index 45f4b3df..283c483e 100644 --- a/crates/erg_common/config.rs +++ b/crates/erg_common/config.rs @@ -27,6 +27,7 @@ pub enum ErgMode { Execute, LanguageServer, Read, + Pack, } impl TryFrom<&str> for ErgMode { @@ -43,6 +44,7 @@ impl TryFrom<&str> for ErgMode { "run" | "execute" => Ok(Self::Execute), "server" | "language-server" => Ok(Self::LanguageServer), "byteread" | "read" | "reader" | "dis" => Ok(Self::Read), + "pack" | "package" => Ok(Self::Pack), _ => Err(()), } } @@ -61,6 +63,7 @@ impl From for &str { ErgMode::Execute => "execute", ErgMode::LanguageServer => "language-server", ErgMode::Read => "read", + ErgMode::Pack => "pack", } } } @@ -404,6 +407,12 @@ USAGE: _ => { if let Ok(mode) = ErgMode::try_from(&arg[..]) { cfg.mode = mode; + if cfg.mode == ErgMode::Pack { + for arg in args { + cfg.runtime_args.push(Box::leak(arg.into_boxed_str())); + } + break; + } } else { let path = PathBuf::from_str(&arg[..]) .unwrap_or_else(|_| panic!("invalid file path: {arg}")); diff --git a/src/dummy.rs b/src/dummy.rs index 1e32d85d..c69058a6 100644 --- a/src/dummy.rs +++ b/src/dummy.rs @@ -1,7 +1,7 @@ use std::fs::remove_file; use std::io::{Read, Write}; use std::net::{Ipv4Addr, SocketAddrV4, TcpListener, TcpStream}; -use std::process; +use std::process::{self, Command, Stdio}; use std::thread::sleep; use std::time::Duration; @@ -396,3 +396,32 @@ impl DummyVM { Runnable::eval(self, src) } } + +#[derive(Debug, Default)] +pub struct PackageManagerRunner {} + +impl PackageManagerRunner { + pub fn new() -> Self { + Self {} + } + + pub fn run(cfg: ErgConfig) -> ExitStatus { + if Command::new("poise").arg("--version").output().is_err() { + eprintln!("Error: poise is not installed"); + return ExitStatus::ERR1; + } + match Command::new("poise") + .stdin(Stdio::inherit()) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .args(&cfg.runtime_args) + .output() + { + Ok(out) => ExitStatus::new(out.status.code().unwrap_or(0), 0, 0), + Err(err) => { + eprintln!("Error: {}", err); + ExitStatus::ERR1 + } + } + } +} diff --git a/src/lib.rs b/src/lib.rs index b6ba7664..4ba10818 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ extern crate erg_common; extern crate erg_compiler; mod dummy; -pub use dummy::DummyVM; +pub use dummy::{DummyVM, PackageManagerRunner}; diff --git a/src/main.rs b/src/main.rs index a8ee745f..12463c5c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,7 +14,7 @@ use erg_compiler::transpile::Transpiler; use erg_compiler::ty::deserialize::Deserializer; use erg_compiler::{ASTBuilder, Compiler}; -use erg::DummyVM; +use erg::{DummyVM, PackageManagerRunner}; fn run() { let cfg = ErgConfig::parse(); @@ -28,6 +28,7 @@ fn run() { Transpile => Transpiler::run(cfg), Execute => DummyVM::run(cfg), Read => Deserializer::run(cfg), + Pack => PackageManagerRunner::run(cfg), LanguageServer => { #[cfg(feature = "els")] {