diff --git a/Cargo.lock b/Cargo.lock index 6e4a2fc494..9180486eb3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2500,6 +2500,16 @@ dependencies = [ "url", ] +[[package]] +name = "nu_plugin_headers" +version = "0.1.0" +dependencies = [ + "nu-errors", + "nu-plugin", + "nu-protocol", + "nu-source", +] + [[package]] name = "nu_plugin_inc" version = "0.11.0" diff --git a/crates/nu-cli/src/commands/headers.rs b/crates/nu-cli/src/commands/headers.rs new file mode 100644 index 0000000000..f75dad1c1f --- /dev/null +++ b/crates/nu-cli/src/commands/headers.rs @@ -0,0 +1,39 @@ +use crate::commands::WholeStreamCommand; +use crate::context::CommandRegistry; +use crate::prelude::*; +use futures::stream::StreamExt; +use nu_errors::ShellError; +use nu_protocol::{ReturnSuccess, Signature, UntaggedValue, Value}; + +pub struct Headers; + +impl WholeStreamCommand for Headers { + fn name(&self) -> &str { + "headers" + } + fn signature(&self) -> Signature { + Signature::build("headers") + } + fn usage(&self) -> &str { + "Use the first row of the table as headers" + } + fn run( + &self, + args: CommandArgs, + registry: &CommandRegistry, + ) -> Result { + args.process(registry, count)?.run() + } +} +pub fn count( + CountArgs {}: CountArgs, + RunnableContext { input, name, .. }: RunnableContext, +) -> Result { + let stream = async_stream! { + let rows: Vec = input.values.collect().await; + + yield ReturnSuccess::value(UntaggedValue::int(rows.len()).into_value(name)) + }; + + Ok(stream.to_output_stream()) +} diff --git a/crates/nu_plugin_headers/.projectile b/crates/nu_plugin_headers/.projectile new file mode 100644 index 0000000000..e69de29bb2 diff --git a/crates/nu_plugin_headers/Cargo.toml b/crates/nu_plugin_headers/Cargo.toml new file mode 100644 index 0000000000..33c90a8dfc --- /dev/null +++ b/crates/nu_plugin_headers/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "nu_plugin_headers" +version = "0.1.0" +authors = ["Sam Hedin "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +nu-plugin = { path = "../nu-plugin", version = "0.11.0" } +nu-protocol = { path = "../nu-protocol", version = "0.11.0" } +nu-source = { path = "../nu-source", version = "0.11.0" } +nu-errors = { path = "../nu-errors", version = "0.11.0" } diff --git a/crates/nu_plugin_headers/Makefile b/crates/nu_plugin_headers/Makefile new file mode 100644 index 0000000000..8f441857a7 --- /dev/null +++ b/crates/nu_plugin_headers/Makefile @@ -0,0 +1,2 @@ +out: + cargo install --path . --force diff --git a/crates/nu_plugin_headers/src/headers.rs b/crates/nu_plugin_headers/src/headers.rs new file mode 100644 index 0000000000..4d64bdfd5b --- /dev/null +++ b/crates/nu_plugin_headers/src/headers.rs @@ -0,0 +1,18 @@ +pub struct Headers; +impl Headers { + pub fn new() -> Headers { + Headers + } +} + +impl WholeStreamCommand for Headers { + fn name(&self) -> &str{ + "headers" + } + fn signature(&self) -> Signature { + Signature::build("headers") + } + fn usage(&self) -> &str { + "Use the first row of the table as headers" + } +} \ No newline at end of file diff --git a/crates/nu_plugin_headers/src/lib.rs b/crates/nu_plugin_headers/src/lib.rs new file mode 100644 index 0000000000..26524a67fa --- /dev/null +++ b/crates/nu_plugin_headers/src/lib.rs @@ -0,0 +1,3 @@ +mod nu; +mod headers; +pub use headers::Headers; \ No newline at end of file diff --git a/crates/nu_plugin_headers/src/main.rs b/crates/nu_plugin_headers/src/main.rs new file mode 100644 index 0000000000..04a8125ae9 --- /dev/null +++ b/crates/nu_plugin_headers/src/main.rs @@ -0,0 +1,7 @@ +use nu_plugin::serve_plugin; +use nu_plugin_headers::Headers; + +//https://github.com/nushell/nushell/issues/1486 +fn main() { + serve_plugin(&mut Headers::new()) +} diff --git a/crates/nu_plugin_headers/src/nu/mod.rs b/crates/nu_plugin_headers/src/nu/mod.rs new file mode 100644 index 0000000000..0939d71b10 --- /dev/null +++ b/crates/nu_plugin_headers/src/nu/mod.rs @@ -0,0 +1,16 @@ +use crate::headers::Headers; +use nu_errors::ShellError; +use nu_plugin::Plugin; +use nu_protocol::{CallInfo, ReturnSuccess, ReturnValue, Signature, Value}; + +impl Plugin for Headers { + fn config(&mut self) -> Result { + Ok(Signature::build("headers") + .desc("Use the first row of the table as headers") + .filter()) + } + + fn begin_filter(&mut self, call_info: CallInfo) -> Result, ShellError> { + Ok(vec![]) + } +} \ No newline at end of file