A bit more infra

This commit is contained in:
Yehuda Katz 2019-05-11 00:00:33 -07:00
parent e44d657424
commit 51e921b085
10 changed files with 116 additions and 12 deletions

25
Cargo.lock generated
View file

@ -170,6 +170,11 @@ dependencies = [
"cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "crossbeam-utils"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "csv" name = "csv"
version = "1.0.7" version = "1.0.7"
@ -209,6 +214,11 @@ dependencies = [
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "dunce"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "either" name = "either"
version = "1.5.2" version = "1.5.2"
@ -361,10 +371,12 @@ dependencies = [
"chrono-tz 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "chrono-tz 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"conch-parser 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "conch-parser 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
"dunce 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"nom 5.0.0-beta1 (registry+https://github.com/rust-lang/crates.io-index)", "nom 5.0.0-beta1 (registry+https://github.com/rust-lang/crates.io-index)",
"prettytable-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "prettytable-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rustyline 4.0.0 (git+https://github.com/jonathandturner/rustyline.git)", "rustyline 4.0.0 (git+https://github.com/jonathandturner/rustyline.git)",
"subprocess 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)",
"sysinfo 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", "sysinfo 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -558,6 +570,16 @@ name = "static_assertions"
version = "0.2.5" version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "subprocess"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "syn" name = "syn"
version = "0.15.34" version = "0.15.34"
@ -718,10 +740,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3"
"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150"
"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9"
"checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015"
"checksum csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9044e25afb0924b5a5fc5511689b0918629e85d68ea591e5e87fbf1e85ea1b3b" "checksum csv 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9044e25afb0924b5a5fc5511689b0918629e85d68ea591e5e87fbf1e85ea1b3b"
"checksum csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5cdef62f37e6ffe7d1f07a381bc0db32b7a3ff1cac0de56cb0d81e71f53d65" "checksum csv-core 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5cdef62f37e6ffe7d1f07a381bc0db32b7a3ff1cac0de56cb0d81e71f53d65"
"checksum derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6ca414e896ae072546f4d789f452daaecf60ddee4c9df5dc6d5936d769e3d87c" "checksum derive-new 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "6ca414e896ae072546f4d789f452daaecf60ddee4c9df5dc6d5936d769e3d87c"
"checksum dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" "checksum dirs 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901"
"checksum dunce 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0ad6bf6a88548d1126045c413548df1453d9be094a8ab9fd59bf1fdd338da4f"
"checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b" "checksum either 1.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5527cfe0d098f36e3f8839852688e63c8fff1c90b2b405aef730615f9a7bcf7b"
"checksum encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd" "checksum encode_unicode 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90b2c9496c001e8cb61827acdefad780795c42264c137744cae6f7d9e3450abd"
"checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2" "checksum failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "795bd83d3abeb9220f257e597aa0080a508b27533824adf336529648f6abf7e2"
@ -765,6 +789,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd" "checksum serde 1.0.91 (registry+https://github.com/rust-lang/crates.io-index)" = "a72e9b96fa45ce22a4bc23da3858dfccfd60acd28a25bcd328a98fdd6bea43fd"
"checksum stackvector 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c049c77bf85fbc036484c97b008276d539d9ebff9dfbde37b632ebcd5b8746b6" "checksum stackvector 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c049c77bf85fbc036484c97b008276d539d9ebff9dfbde37b632ebcd5b8746b6"
"checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5"
"checksum subprocess 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "28fc0f40f0c0da73339d347aa7d6d2b90341a95683a47722bc4eebed71ff3c00"
"checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe" "checksum syn 0.15.34 (registry+https://github.com/rust-lang/crates.io-index)" = "a1393e4a97a19c01e900df2aec855a29f71cf02c402e2f443b8d2747c25c5dbe"
"checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015" "checksum synstructure 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "73687139bf99285483c96ac0add482c3776528beac1d97d444f6e91f203a2015"
"checksum sysinfo 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d88e417391431019773011a31a6c967538da388782b7711f2f6fafd9e601e55" "checksum sysinfo 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d88e417391431019773011a31a6c967538da388782b7711f2f6fafd9e601e55"

View file

@ -17,3 +17,5 @@ itertools = "0.8.0"
ansi_term = "0.11.0" ansi_term = "0.11.0"
conch-parser = "0.1.0" conch-parser = "0.1.0"
nom = "5.0.0-beta1" nom = "5.0.0-beta1"
subprocess = "0.1.18"
dunce = "1.0.0"

View file

@ -23,3 +23,44 @@ ls | zomg
ls soms ls soms
ls something ls something
ls something | grep ls something | grep
dir
npm --help
cd target
dir
ls
cd target
cd ..
dir
cd target
cd ..
cd target
cd ..
ls
dir
cd target
ls
cd ..
ls
cd target
cd ..
cd target
cd ..
cd target
cd ..
cd target
cd ..
cd target
cd ..
cd target
cd ..
cd target
cd ..
ls
cd target
cd ..
cargo build
cargo build --verbose
ls
cargo
cargo build
cargo run

View file

@ -1,3 +1,4 @@
crate mod cd;
crate mod command; crate mod command;
crate mod ls; crate mod ls;
crate mod ps; crate mod ps;

21
src/commands/cd.rs Normal file
View file

@ -0,0 +1,21 @@
use crate::errors::ShellError;
use crate::object::process::Process;
use crate::object::{DirEntry, ShellObject, Value};
use derive_new::new;
use std::path::{Path, PathBuf};
use sysinfo::SystemExt;
#[derive(new)]
pub struct Cd;
impl crate::Command for Cd {
fn run(
&mut self,
args: Vec<String>,
_host: &dyn crate::Host,
env: &mut crate::Environment,
) -> Result<Value, ShellError> {
env.cwd = dunce::canonicalize(env.cwd().join(&args[0]).as_path())?;
Ok(Value::nothing())
}
}

View file

@ -4,6 +4,7 @@ use crate::object::Value;
pub trait Command { pub trait Command {
fn run( fn run(
&mut self, &mut self,
args: Vec<String>,
host: &dyn crate::Host, host: &dyn crate::Host,
env: &mut crate::Environment, env: &mut crate::Environment,
) -> Result<Value, ShellError>; ) -> Result<Value, ShellError>;

View file

@ -10,6 +10,7 @@ pub struct Ls;
impl crate::Command for Ls { impl crate::Command for Ls {
fn run( fn run(
&mut self, &mut self,
_args: Vec<String>,
_host: &dyn crate::Host, _host: &dyn crate::Host,
env: &mut crate::Environment, env: &mut crate::Environment,
) -> Result<Value, ShellError> { ) -> Result<Value, ShellError> {

View file

@ -12,6 +12,7 @@ pub struct Ps {
impl crate::Command for Ps { impl crate::Command for Ps {
fn run( fn run(
&mut self, &mut self,
_args: Vec<String>,
_host: &dyn crate::Host, _host: &dyn crate::Host,
_env: &mut crate::Environment, _env: &mut crate::Environment,
) -> Result<Value, ShellError> { ) -> Result<Value, ShellError> {

View file

@ -1,7 +1,8 @@
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
#[derive(Debug, Clone)]
pub struct Environment { pub struct Environment {
cwd: PathBuf, crate cwd: PathBuf,
} }
impl Environment { impl Environment {

View file

@ -11,18 +11,18 @@ mod parser;
crate use crate::commands::command::Command; crate use crate::commands::command::Command;
crate use crate::env::{Environment, Host}; crate use crate::env::{Environment, Host};
crate use crate::format::RenderView;
crate use crate::errors::ShellError; crate use crate::errors::ShellError;
crate use crate::format::RenderView;
use crate::object::base::{ToEntriesView, ToGenericView}; use crate::object::base::{ToEntriesView, ToGenericView};
use ansi_term::Color;
use conch_parser::lexer::Lexer;
use conch_parser::parse::DefaultParser;
use rustyline::error::ReadlineError; use rustyline::error::ReadlineError;
use rustyline::Editor; use rustyline::Editor;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::error::Error; use std::error::Error;
use subprocess::Exec;
use sysinfo::{self, SystemExt}; use sysinfo::{self, SystemExt};
use ansi_term::Color;
use conch_parser::lexer::Lexer;
use conch_parser::parse::DefaultParser;
#[derive(Debug)] #[derive(Debug)]
pub enum MaybeOwned<'a, T> { pub enum MaybeOwned<'a, T> {
@ -53,16 +53,22 @@ fn main() -> Result<(), Box<Error>> {
let mut system = sysinfo::System::new(); let mut system = sysinfo::System::new();
let mut ps = crate::commands::ps::Ps::new(system); let mut ps = crate::commands::ps::Ps::new(system);
let mut ls = crate::commands::ls::Ls; let mut ls = crate::commands::ls::Ls;
let mut cd = crate::commands::cd::Cd;
commands.insert("ps".to_string(), Box::new(ps)); commands.insert("ps".to_string(), Box::new(ps));
commands.insert("ls".to_string(), Box::new(ls)); commands.insert("ls".to_string(), Box::new(ls));
commands.insert("cd".to_string(), Box::new(cd));
loop { loop {
let readline = rl.readline(&format!("{}> ", Color::Green.paint(env.cwd().display().to_string()))); let readline = rl.readline(&format!(
"{}> ",
Color::Green.paint(env.cwd().display().to_string())
));
match readline { match readline {
Ok(line) => { Ok(line) => {
let result = crate::parser::shell_parser(&line).map_err(|e| ShellError::new(format!("{:?}", e)))?; let result = crate::parser::shell_parser(&line)
.map_err(|e| ShellError::new(format!("{:?}", e)))?;
let parsed = result.1; let parsed = result.1;
@ -72,13 +78,15 @@ fn main() -> Result<(), Box<Error>> {
println!("Piping is not yet implemented"); println!("Piping is not yet implemented");
} }
println!("DEBUG: {:?}", parsed);
let command = &parsed[0][0].name(); let command = &parsed[0][0].name();
let args = parsed[0][1..]
.iter()
.map(|i| i.name().to_string())
.collect();
match commands.get_mut(*command) { match commands.get_mut(*command) {
Some(command) => { Some(command) => {
let result = command.run(&mut host, &mut env).unwrap(); let result = command.run(args, &mut host, &mut env).unwrap();
let view = result.to_generic_view(); let view = result.to_generic_view();
let rendered = view.render_view(&mut host); let rendered = view.render_view(&mut host);
@ -90,7 +98,9 @@ fn main() -> Result<(), Box<Error>> {
} }
} }
_ => println!("Saw: {}", line), other => {
Exec::shell(line).cwd(env.cwd()).join().unwrap();
}
} }
} }
Err(ReadlineError::Interrupted) => { Err(ReadlineError::Interrupted) => {