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, Execute,
LanguageServer, LanguageServer,
Read, Read,
Pack,
} }
impl TryFrom<&str> for ErgMode { impl TryFrom<&str> for ErgMode {
@ -43,6 +44,7 @@ impl TryFrom<&str> for ErgMode {
"run" | "execute" => Ok(Self::Execute), "run" | "execute" => Ok(Self::Execute),
"server" | "language-server" => Ok(Self::LanguageServer), "server" | "language-server" => Ok(Self::LanguageServer),
"byteread" | "read" | "reader" | "dis" => Ok(Self::Read), "byteread" | "read" | "reader" | "dis" => Ok(Self::Read),
"pack" | "package" => Ok(Self::Pack),
_ => Err(()), _ => Err(()),
} }
} }
@ -61,6 +63,7 @@ impl From<ErgMode> for &str {
ErgMode::Execute => "execute", ErgMode::Execute => "execute",
ErgMode::LanguageServer => "language-server", ErgMode::LanguageServer => "language-server",
ErgMode::Read => "read", ErgMode::Read => "read",
ErgMode::Pack => "pack",
} }
} }
} }
@ -404,6 +407,12 @@ USAGE:
_ => { _ => {
if let Ok(mode) = ErgMode::try_from(&arg[..]) { if let Ok(mode) = ErgMode::try_from(&arg[..]) {
cfg.mode = mode; cfg.mode = mode;
if cfg.mode == ErgMode::Pack {
for arg in args {
cfg.runtime_args.push(Box::leak(arg.into_boxed_str()));
}
break;
}
} else { } else {
let path = PathBuf::from_str(&arg[..]) let path = PathBuf::from_str(&arg[..])
.unwrap_or_else(|_| panic!("invalid file path: {arg}")); .unwrap_or_else(|_| panic!("invalid file path: {arg}"));

View file

@ -1,7 +1,7 @@
use std::fs::remove_file; use std::fs::remove_file;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::net::{Ipv4Addr, SocketAddrV4, TcpListener, TcpStream}; use std::net::{Ipv4Addr, SocketAddrV4, TcpListener, TcpStream};
use std::process; use std::process::{self, Command, Stdio};
use std::thread::sleep; use std::thread::sleep;
use std::time::Duration; use std::time::Duration;
@ -396,3 +396,32 @@ impl DummyVM {
Runnable::eval(self, src) 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_common;
extern crate erg_compiler; extern crate erg_compiler;
mod dummy; 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::ty::deserialize::Deserializer;
use erg_compiler::{ASTBuilder, Compiler}; use erg_compiler::{ASTBuilder, Compiler};
use erg::DummyVM; use erg::{DummyVM, PackageManagerRunner};
fn run() { fn run() {
let cfg = ErgConfig::parse(); let cfg = ErgConfig::parse();
@ -28,6 +28,7 @@ fn run() {
Transpile => Transpiler::run(cfg), Transpile => Transpiler::run(cfg),
Execute => DummyVM::run(cfg), Execute => DummyVM::run(cfg),
Read => Deserializer::run(cfg), Read => Deserializer::run(cfg),
Pack => PackageManagerRunner::run(cfg),
LanguageServer => { LanguageServer => {
#[cfg(feature = "els")] #[cfg(feature = "els")]
{ {