feat: add pack subcommand

This commit is contained in:
Shunsuke Shibayama 2024-01-06 01:14:21 +09:00
parent 5b74077955
commit 1aa0123ce6
4 changed files with 42 additions and 3 deletions

View file

@ -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<ErgMode> 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}"));

View file

@ -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
}
}
}
}

View file

@ -1,4 +1,4 @@
extern crate erg_common;
extern crate erg_compiler;
mod dummy;
pub use dummy::DummyVM;
pub use dummy::{DummyVM, PackageManagerRunner};

View file

@ -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")]
{