nushell/src/commands/clip.rs

78 lines
2.0 KiB
Rust
Raw Normal View History

2019-08-02 21:15:07 +02:00
use crate::commands::{CommandArgs, StaticCommand};
use crate::context::CommandRegistry;
use crate::errors::{labelled, ShellError};
2019-08-02 21:15:07 +02:00
use crate::prelude::*;
2019-06-07 18:30:50 +02:00
use clipboard::{ClipboardContext, ClipboardProvider};
2019-08-02 21:15:07 +02:00
use futures::stream::StreamExt;
use futures_async_stream::async_stream_block;
2019-06-07 18:30:50 +02:00
2019-08-02 21:15:07 +02:00
pub struct Clip;
#[derive(Deserialize)]
pub struct ClipArgs {}
impl StaticCommand for Clip {
fn name(&self) -> &str {
"clip"
}
fn run(
&self,
args: CommandArgs,
registry: &CommandRegistry,
) -> Result<OutputStream, ShellError> {
args.process(registry, clip)?.run()
}
fn signature(&self) -> Signature {
2019-08-03 04:17:28 +02:00
Signature::build("clip")
2019-08-02 21:15:07 +02:00
}
}
pub fn clip(
ClipArgs {}: ClipArgs,
RunnableContext { input, name, .. }: RunnableContext,
) -> Result<OutputStream, ShellError> {
let stream = async_stream_block! {
let values: Vec<Spanned<Value>> = input.values.collect().await;
inner_clip(values, name);
};
let stream: BoxStream<'static, ReturnValue> = stream.boxed();
Ok(OutputStream::from(stream))
}
async fn inner_clip(input: Vec<Spanned<Value>>, name: Option<Span>) -> OutputStream {
2019-06-07 18:30:50 +02:00
let mut clip_context: ClipboardContext = ClipboardProvider::new().unwrap();
let mut new_copy_data = String::new();
2019-08-02 21:15:07 +02:00
if input.len() > 0 {
2019-06-07 18:30:50 +02:00
let mut first = true;
2019-08-02 21:15:07 +02:00
for i in input.iter() {
2019-06-07 18:30:50 +02:00
if !first {
new_copy_data.push_str("\n");
} else {
first = false;
}
2019-08-02 21:15:07 +02:00
let s = i.as_string().map_err(labelled(
name,
"Given non-string data",
"expected strings from pipeline",
2019-08-02 21:15:07 +02:00
));
let string: String = match s {
Ok(string) => string,
Err(err) => return OutputStream::one(Err(err)),
};
new_copy_data.push_str(&string);
2019-06-07 18:30:50 +02:00
}
}
2019-06-07 18:30:50 +02:00
clip_context.set_contents(new_copy_data).unwrap();
2019-08-02 21:15:07 +02:00
OutputStream::empty()
2019-06-07 18:30:50 +02:00
}