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

@ -1884,20 +1884,17 @@ pub mod signature {
!self.reader.get_pointer_field(2).is_null()
}
#[inline]
pub fn get_required_positional(
self,
) -> ::capnp::Result<::capnp::struct_list::Reader<'a, crate::plugin_capnp::argument::Owned>>
{
pub fn get_search_terms(self) -> ::capnp::Result<::capnp::text_list::Reader<'a>> {
::capnp::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(3),
::core::option::Option::None,
)
}
pub fn has_required_positional(&self) -> bool {
pub fn has_search_terms(&self) -> bool {
!self.reader.get_pointer_field(3).is_null()
}
#[inline]
pub fn get_optional_positional(
pub fn get_required_positional(
self,
) -> ::capnp::Result<::capnp::struct_list::Reader<'a, crate::plugin_capnp::argument::Owned>>
{
@ -1906,31 +1903,44 @@ pub mod signature {
::core::option::Option::None,
)
}
pub fn has_optional_positional(&self) -> bool {
pub fn has_required_positional(&self) -> bool {
!self.reader.get_pointer_field(4).is_null()
}
#[inline]
pub fn get_rest(self) -> ::capnp::Result<crate::plugin_capnp::argument::Reader<'a>> {
pub fn get_optional_positional(
self,
) -> ::capnp::Result<::capnp::struct_list::Reader<'a, crate::plugin_capnp::argument::Owned>>
{
::capnp::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(5),
::core::option::Option::None,
)
}
pub fn has_rest(&self) -> bool {
pub fn has_optional_positional(&self) -> bool {
!self.reader.get_pointer_field(5).is_null()
}
#[inline]
pub fn get_rest(self) -> ::capnp::Result<crate::plugin_capnp::argument::Reader<'a>> {
::capnp::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(6),
::core::option::Option::None,
)
}
pub fn has_rest(&self) -> bool {
!self.reader.get_pointer_field(6).is_null()
}
#[inline]
pub fn get_named(
self,
) -> ::capnp::Result<::capnp::struct_list::Reader<'a, crate::plugin_capnp::flag::Owned>>
{
::capnp::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(6),
&self.reader.get_pointer_field(7),
::core::option::Option::None,
)
}
pub fn has_named(&self) -> bool {
!self.reader.get_pointer_field(6).is_null()
!self.reader.get_pointer_field(7).is_null()
}
#[inline]
pub fn get_is_filter(self) -> bool {
@ -2068,12 +2078,40 @@ pub mod signature {
!self.builder.get_pointer_field(2).is_null()
}
#[inline]
pub fn get_search_terms(self) -> ::capnp::Result<::capnp::text_list::Builder<'a>> {
::capnp::traits::FromPointerBuilder::get_from_pointer(
self.builder.get_pointer_field(3),
::core::option::Option::None,
)
}
#[inline]
pub fn set_search_terms(
&mut self,
value: ::capnp::text_list::Reader<'a>,
) -> ::capnp::Result<()> {
::capnp::traits::SetPointerBuilder::set_pointer_builder(
self.builder.get_pointer_field(3),
value,
false,
)
}
#[inline]
pub fn init_search_terms(self, size: u32) -> ::capnp::text_list::Builder<'a> {
::capnp::traits::FromPointerBuilder::init_pointer(
self.builder.get_pointer_field(3),
size,
)
}
pub fn has_search_terms(&self) -> bool {
!self.builder.get_pointer_field(3).is_null()
}
#[inline]
pub fn get_required_positional(
self,
) -> ::capnp::Result<::capnp::struct_list::Builder<'a, crate::plugin_capnp::argument::Owned>>
{
::capnp::traits::FromPointerBuilder::get_from_pointer(
self.builder.get_pointer_field(3),
self.builder.get_pointer_field(4),
::core::option::Option::None,
)
}
@ -2083,7 +2121,7 @@ pub mod signature {
value: ::capnp::struct_list::Reader<'a, crate::plugin_capnp::argument::Owned>,
) -> ::capnp::Result<()> {
::capnp::traits::SetPointerBuilder::set_pointer_builder(
self.builder.get_pointer_field(3),
self.builder.get_pointer_field(4),
value,
false,
)
@ -2094,12 +2132,12 @@ pub mod signature {
size: u32,
) -> ::capnp::struct_list::Builder<'a, crate::plugin_capnp::argument::Owned> {
::capnp::traits::FromPointerBuilder::init_pointer(
self.builder.get_pointer_field(3),
self.builder.get_pointer_field(4),
size,
)
}
pub fn has_required_positional(&self) -> bool {
!self.builder.get_pointer_field(3).is_null()
!self.builder.get_pointer_field(4).is_null()
}
#[inline]
pub fn get_optional_positional(
@ -2107,7 +2145,7 @@ pub mod signature {
) -> ::capnp::Result<::capnp::struct_list::Builder<'a, crate::plugin_capnp::argument::Owned>>
{
::capnp::traits::FromPointerBuilder::get_from_pointer(
self.builder.get_pointer_field(4),
self.builder.get_pointer_field(5),
::core::option::Option::None,
)
}
@ -2117,7 +2155,7 @@ pub mod signature {
value: ::capnp::struct_list::Reader<'a, crate::plugin_capnp::argument::Owned>,
) -> ::capnp::Result<()> {
::capnp::traits::SetPointerBuilder::set_pointer_builder(
self.builder.get_pointer_field(4),
self.builder.get_pointer_field(5),
value,
false,
)
@ -2128,17 +2166,17 @@ pub mod signature {
size: u32,
) -> ::capnp::struct_list::Builder<'a, crate::plugin_capnp::argument::Owned> {
::capnp::traits::FromPointerBuilder::init_pointer(
self.builder.get_pointer_field(4),
self.builder.get_pointer_field(5),
size,
)
}
pub fn has_optional_positional(&self) -> bool {
!self.builder.get_pointer_field(4).is_null()
!self.builder.get_pointer_field(5).is_null()
}
#[inline]
pub fn get_rest(self) -> ::capnp::Result<crate::plugin_capnp::argument::Builder<'a>> {
::capnp::traits::FromPointerBuilder::get_from_pointer(
self.builder.get_pointer_field(5),
self.builder.get_pointer_field(6),
::core::option::Option::None,
)
}
@ -2148,17 +2186,17 @@ pub mod signature {
value: crate::plugin_capnp::argument::Reader<'_>,
) -> ::capnp::Result<()> {
::capnp::traits::SetPointerBuilder::set_pointer_builder(
self.builder.get_pointer_field(5),
self.builder.get_pointer_field(6),
value,
false,
)
}
#[inline]
pub fn init_rest(self) -> crate::plugin_capnp::argument::Builder<'a> {
::capnp::traits::FromPointerBuilder::init_pointer(self.builder.get_pointer_field(5), 0)
::capnp::traits::FromPointerBuilder::init_pointer(self.builder.get_pointer_field(6), 0)
}
pub fn has_rest(&self) -> bool {
!self.builder.get_pointer_field(5).is_null()
!self.builder.get_pointer_field(6).is_null()
}
#[inline]
pub fn get_named(
@ -2166,7 +2204,7 @@ pub mod signature {
) -> ::capnp::Result<::capnp::struct_list::Builder<'a, crate::plugin_capnp::flag::Owned>>
{
::capnp::traits::FromPointerBuilder::get_from_pointer(
self.builder.get_pointer_field(6),
self.builder.get_pointer_field(7),
::core::option::Option::None,
)
}
@ -2176,7 +2214,7 @@ pub mod signature {
value: ::capnp::struct_list::Reader<'a, crate::plugin_capnp::flag::Owned>,
) -> ::capnp::Result<()> {
::capnp::traits::SetPointerBuilder::set_pointer_builder(
self.builder.get_pointer_field(6),
self.builder.get_pointer_field(7),
value,
false,
)
@ -2187,12 +2225,12 @@ pub mod signature {
size: u32,
) -> ::capnp::struct_list::Builder<'a, crate::plugin_capnp::flag::Owned> {
::capnp::traits::FromPointerBuilder::init_pointer(
self.builder.get_pointer_field(6),
self.builder.get_pointer_field(7),
size,
)
}
pub fn has_named(&self) -> bool {
!self.builder.get_pointer_field(6).is_null()
!self.builder.get_pointer_field(7).is_null()
}
#[inline]
pub fn get_is_filter(self) -> bool {
@ -2226,14 +2264,14 @@ pub mod signature {
}
impl Pipeline {
pub fn get_rest(&self) -> crate::plugin_capnp::argument::Pipeline {
::capnp::capability::FromTypelessPipeline::new(self._typeless.get_pointer_field(5))
::capnp::capability::FromTypelessPipeline::new(self._typeless.get_pointer_field(6))
}
}
mod _private {
use capnp::private::layout;
pub const STRUCT_SIZE: layout::StructSize = layout::StructSize {
data: 1,
pointers: 7,
pointers: 8,
};
pub const TYPE_ID: u64 = 0xec96_eeb4_8cb7_90fa;
}

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