mirror of
https://github.com/nushell/nushell.git
synced 2025-08-18 16:09:04 +02:00
Add search terms to Command and Signature (#4980)
* Add search terms to command * Rename Signature desc to usage To be named uniformly with extra_usage * Throw in foldl search term for reduce * Add missing usage to post * Add search terms to signature * Try to add capnp Signature serialization
This commit is contained in:
@@ -55,13 +55,14 @@ struct Signature {
|
||||
name @0 :Text;
|
||||
usage @1 :Text;
|
||||
extraUsage @2 :Text;
|
||||
requiredPositional @3 :List(Argument);
|
||||
optionalPositional @4 :List(Argument);
|
||||
searchTerms @3 :List(Text);
|
||||
requiredPositional @4 :List(Argument);
|
||||
optionalPositional @5 :List(Argument);
|
||||
# Optional value. Check for existence when deserializing
|
||||
rest @5 :Argument;
|
||||
named @6 :List(Flag);
|
||||
isFilter @7 :Bool;
|
||||
category @8 :Category;
|
||||
rest @6 :Argument;
|
||||
named @7 :List(Flag);
|
||||
isFilter @8 :Bool;
|
||||
category @9 :Category;
|
||||
}
|
||||
|
||||
enum Category {
|
||||
|
@@ -30,6 +30,17 @@ pub(crate) fn serialize_signature(signature: &Signature, mut builder: signature:
|
||||
_ => builder.set_category(PluginCategory::Default),
|
||||
}
|
||||
|
||||
// Serializing list of search terms
|
||||
let mut search_terms_builder = builder
|
||||
.reborrow()
|
||||
.init_search_terms(signature.search_terms.len() as u32);
|
||||
|
||||
signature
|
||||
.search_terms
|
||||
.iter()
|
||||
.enumerate()
|
||||
.for_each(|(index, term)| search_terms_builder.set(index as u32, term.as_str()));
|
||||
|
||||
// Serializing list of required arguments
|
||||
let mut required_list = builder
|
||||
.reborrow()
|
||||
@@ -136,6 +147,17 @@ pub(crate) fn deserialize_signature(reader: signature::Reader) -> Result<Signatu
|
||||
PluginCategory::Generators => Category::Generators,
|
||||
};
|
||||
|
||||
// Deserializing list of search terms
|
||||
let search_terms = reader
|
||||
.get_search_terms()
|
||||
.map_err(|e| ShellError::PluginFailedToDecode(e.to_string()))?
|
||||
.iter()
|
||||
.map(|term| {
|
||||
term.map_err(|e| ShellError::PluginFailedToDecode(e.to_string()))
|
||||
.map(|term| term.to_string())
|
||||
})
|
||||
.collect::<Result<Vec<String>, ShellError>>()?;
|
||||
|
||||
// Deserializing required arguments
|
||||
let required_list = reader
|
||||
.get_required_positional()
|
||||
@@ -181,6 +203,7 @@ pub(crate) fn deserialize_signature(reader: signature::Reader) -> Result<Signatu
|
||||
name: name.to_string(),
|
||||
usage: usage.to_string(),
|
||||
extra_usage: extra_usage.to_string(),
|
||||
search_terms,
|
||||
required_positional,
|
||||
optional_positional,
|
||||
rest_positional,
|
||||
@@ -349,7 +372,8 @@ mod tests {
|
||||
#[test]
|
||||
fn value_round_trip_2() {
|
||||
let signature = Signature::build("test-1")
|
||||
.desc("Signature test 1 for plugin. Returns Value::Nothing")
|
||||
.usage("Signature test 1 for plugin. Returns Value::Nothing")
|
||||
.search_terms(vec!["a".into(), "b".into()])
|
||||
.required("a", SyntaxShape::Int, "required integer value")
|
||||
.required("b", SyntaxShape::String, "required string value")
|
||||
.optional("opt", SyntaxShape::Boolean, "Optional boolean")
|
||||
@@ -368,6 +392,12 @@ mod tests {
|
||||
assert_eq!(signature.is_filter, returned_signature.is_filter);
|
||||
assert_eq!(signature.category, returned_signature.category);
|
||||
|
||||
signature
|
||||
.search_terms
|
||||
.iter()
|
||||
.zip(returned_signature.search_terms.iter())
|
||||
.for_each(|(lhs, rhs)| assert_eq!(lhs, rhs));
|
||||
|
||||
signature
|
||||
.required_positional
|
||||
.iter()
|
||||
|
Reference in New Issue
Block a user