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:
Jakub Žádník
2022-03-27 22:25:30 +03:00
committed by GitHub
parent 0c9dd6a29a
commit 2873e943b3
32 changed files with 269 additions and 100 deletions

View File

@@ -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 {

View File

@@ -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()