mirror of
https://github.com/nushell/nushell.git
synced 2024-11-22 00:13:21 +01:00
A bit more infra
This commit is contained in:
parent
e44d657424
commit
51e921b085
25
Cargo.lock
generated
25
Cargo.lock
generated
@ -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"
|
||||||
|
@ -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"
|
||||||
|
41
history.txt
41
history.txt
@ -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
|
||||||
|
@ -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
21
src/commands/cd.rs
Normal 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())
|
||||||
|
}
|
||||||
|
}
|
@ -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>;
|
||||||
|
@ -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> {
|
||||||
|
@ -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> {
|
||||||
|
3
src/env/environment.rs
vendored
3
src/env/environment.rs
vendored
@ -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 {
|
||||||
|
32
src/main.rs
32
src/main.rs
@ -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) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user