Remove the old it-hacks from fetch and post (#1807)

This commit is contained in:
Jonathan Turner 2020-05-16 11:18:46 -07:00 committed by GitHub
parent f43ed23ed7
commit 48d06f40b1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 12 additions and 57 deletions

View file

@ -72,11 +72,7 @@ pub fn filter_plugin(
trace!("filter_plugin :: {}", path); trace!("filter_plugin :: {}", path);
let registry = registry.clone(); let registry = registry.clone();
let scope = args let scope = args.call_info.scope.clone();
.call_info
.scope
.clone()
.set_it(UntaggedValue::string("$it").into_untagged_value());
let stream = async_stream! { let stream = async_stream! {
let mut args = args.evaluate_once_with_scope(&registry, &scope).await?; let mut args = args.evaluate_once_with_scope(&registry, &scope).await?;

View file

@ -9,6 +9,7 @@ use surf::mime;
#[derive(Default)] #[derive(Default)]
pub struct Fetch { pub struct Fetch {
pub path: Option<Value>, pub path: Option<Value>,
pub tag: Tag,
pub has_raw: bool, pub has_raw: bool,
} }
@ -16,6 +17,7 @@ impl Fetch {
pub fn new() -> Fetch { pub fn new() -> Fetch {
Fetch { Fetch {
path: None, path: None,
tag: Tag::unknown(),
has_raw: false, has_raw: false,
} }
} }
@ -31,6 +33,7 @@ impl Fetch {
})?; })?;
file.clone() file.clone()
}); });
self.tag = call_info.name_tag.clone();
self.has_raw = call_info.args.has("raw"); self.has_raw = call_info.args.has("raw");
@ -38,18 +41,8 @@ impl Fetch {
} }
} }
pub async fn fetch_helper(path: &Value, has_raw: bool, row: Value) -> ReturnValue { pub async fn fetch_helper(path: &Value, has_raw: bool) -> ReturnValue {
let path_buf = path.as_path()?; let path_str = path.as_string()?;
let path_str = path_buf.display().to_string();
//FIXME: this is a workaround because plugins don't yet support per-item iteration
let path_str = if path_str == "$it" {
let path_buf = row.as_path()?;
path_buf.display().to_string()
} else {
path_str
};
let path_span = path.tag.span; let path_span = path.tag.span;
let result = fetch(&path_str, path_span, has_raw).await; let result = fetch(&path_str, path_span, has_raw).await;

View file

@ -1,7 +1,7 @@
use futures::executor::block_on; use futures::executor::block_on;
use nu_errors::ShellError; use nu_errors::ShellError;
use nu_plugin::Plugin; use nu_plugin::Plugin;
use nu_protocol::{CallInfo, ReturnValue, Signature, SyntaxShape, Value}; use nu_protocol::{CallInfo, ReturnValue, Signature, SyntaxShape};
use crate::fetch::fetch_helper; use crate::fetch::fetch_helper;
use crate::Fetch; use crate::Fetch;
@ -11,8 +11,8 @@ impl Plugin for Fetch {
Ok(Signature::build("fetch") Ok(Signature::build("fetch")
.desc("Load from a URL into a cell, convert to table if possible (avoid by appending '--raw')") .desc("Load from a URL into a cell, convert to table if possible (avoid by appending '--raw')")
.required( .required(
"path", "URL",
SyntaxShape::Path, SyntaxShape::String,
"the URL to fetch the contents from", "the URL to fetch the contents from",
) )
.switch("raw", "fetch contents as text rather than a table", Some('r')) .switch("raw", "fetch contents as text rather than a table", Some('r'))
@ -21,20 +21,11 @@ impl Plugin for Fetch {
fn begin_filter(&mut self, callinfo: CallInfo) -> Result<Vec<ReturnValue>, ShellError> { fn begin_filter(&mut self, callinfo: CallInfo) -> Result<Vec<ReturnValue>, ShellError> {
self.setup(callinfo)?; self.setup(callinfo)?;
Ok(vec![])
}
fn filter(&mut self, value: Value) -> Result<Vec<ReturnValue>, ShellError> {
Ok(vec![block_on(fetch_helper( Ok(vec![block_on(fetch_helper(
&self.path.clone().ok_or_else(|| { &self.path.clone().ok_or_else(|| {
ShellError::labeled_error( ShellError::labeled_error("internal error: path not set", "path not set", &self.tag)
"internal error: path not set",
"path not set",
&value.tag,
)
})?, })?,
self.has_raw, self.has_raw,
value,
))]) ))])
} }
} }

View file

@ -1,7 +1,7 @@
use futures::executor::block_on; use futures::executor::block_on;
use nu_errors::ShellError; use nu_errors::ShellError;
use nu_plugin::Plugin; use nu_plugin::Plugin;
use nu_protocol::{CallInfo, ReturnValue, Signature, SyntaxShape, Value}; use nu_protocol::{CallInfo, ReturnValue, Signature, SyntaxShape};
use crate::post::post_helper; use crate::post::post_helper;
use crate::Post; use crate::Post;
@ -46,10 +46,6 @@ impl Plugin for Post {
fn begin_filter(&mut self, call_info: CallInfo) -> Result<Vec<ReturnValue>, ShellError> { fn begin_filter(&mut self, call_info: CallInfo) -> Result<Vec<ReturnValue>, ShellError> {
self.setup(call_info)?; self.setup(call_info)?;
Ok(vec![])
}
fn filter(&mut self, row: Value) -> Result<Vec<ReturnValue>, ShellError> {
Ok(vec![block_on(post_helper( Ok(vec![block_on(post_helper(
&self.path.clone().ok_or_else(|| { &self.path.clone().ok_or_else(|| {
ShellError::labeled_error("expected a 'path'", "expected a 'path'", &self.tag) ShellError::labeled_error("expected a 'path'", "expected a 'path'", &self.tag)
@ -61,7 +57,6 @@ impl Plugin for Post {
self.user.clone(), self.user.clone(),
self.password.clone(), self.password.clone(),
&self.headers.clone(), &self.headers.clone(),
row,
))]) ))])
} }
} }

View file

@ -87,29 +87,9 @@ pub async fn post_helper(
user: Option<String>, user: Option<String>,
password: Option<String>, password: Option<String>,
headers: &[HeaderKind], headers: &[HeaderKind],
row: Value,
) -> ReturnValue { ) -> ReturnValue {
let path_tag = path.tag.clone(); let path_tag = path.tag.clone();
let path_str = path.as_string()?.to_string(); let path_str = path.as_string()?;
//FIXME: this is a workaround because plugins don't yet support per-item iteration
let path_str = if path_str == "$it" {
let path_buf = row.as_path()?;
path_buf.display().to_string()
} else {
path_str
};
//FIXME: this is a workaround because plugins don't yet support per-item iteration
let body = if let Ok(x) = body.as_string() {
if x == "$it" {
&row
} else {
body
}
} else {
body
};
let (file_extension, contents, contents_tag) = let (file_extension, contents, contents_tag) =
post(&path_str, &body, user, password, &headers, path_tag.clone()).await?; post(&path_str, &body, user, password, &headers, path_tag.clone()).await?;