Skip to content

Commit

Permalink
Add codegen to expose getter as bytes for text fields
Browse files Browse the repository at this point in the history
Exposes as getter as bytes for text fields in the codegen. This is a
secondary getter that is for now only populating anything for text
fields for readers. I have duplicated the method and trimmed it only
for texts instead of complexifying the already existent getter_text
function for the sake of clarity.

This also regenerates the corresponding rpc_capnp and schema_capnp rust
files.
  • Loading branch information
antoinecordelle committed Aug 23, 2023
1 parent 32dda92 commit 2707372
Show file tree
Hide file tree
Showing 3 changed files with 215 additions and 22 deletions.
18 changes: 18 additions & 0 deletions capnp-rpc/src/rpc_capnp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8008,6 +8008,15 @@ pub mod exception {
}
}
#[inline]
pub fn get_reason_as_bytes(self) -> ::capnp::Result<&'a [u8]> {
::core::result::Result::Ok(::capnp::text::Reader::as_bytes(
::capnp::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_reason(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -8037,6 +8046,15 @@ pub mod exception {
}
}
#[inline]
pub fn get_trace_as_bytes(self) -> ::capnp::Result<&'a [u8]> {
::core::result::Result::Ok(::capnp::text::Reader::as_bytes(
::capnp::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(1),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_trace(&self) -> bool {
!self.reader.get_pointer_field(1).is_null()
}
Expand Down
90 changes: 90 additions & 0 deletions capnp/src/schema_capnp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,15 @@ pub mod node {
}
}
#[inline]
pub fn get_display_name_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_display_name(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -899,6 +908,15 @@ pub mod node {
}
}
#[inline]
pub fn get_name_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_name(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -1192,6 +1210,15 @@ pub mod node {
}
}
#[inline]
pub fn get_name_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_name(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -1517,6 +1544,15 @@ pub mod node {
}
}
#[inline]
pub fn get_doc_comment_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_doc_comment(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -1926,6 +1962,15 @@ pub mod node {
}
}
#[inline]
pub fn get_doc_comment_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_doc_comment(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -4436,6 +4481,15 @@ pub mod field {
}
}
#[inline]
pub fn get_name_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_name(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -5951,6 +6005,15 @@ pub mod enumerant {
}
}
#[inline]
pub fn get_name_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_name(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -6664,6 +6727,15 @@ pub mod method {
}
}
#[inline]
pub fn get_name_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_name(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -13848,6 +13920,15 @@ pub mod code_generator_request {
}
}
#[inline]
pub fn get_filename_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_filename(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down Expand Up @@ -14263,6 +14344,15 @@ pub mod code_generator_request {
}
}
#[inline]
pub fn get_name_as_bytes(self) -> crate::Result<&'a [u8]> {
::core::result::Result::Ok(crate::text::Reader::as_bytes(
crate::traits::FromPointerReader::get_from_pointer(
&self.reader.get_pointer_field(0),
::core::option::Option::None,
)?,
))
}
#[inline]
pub fn has_name(&self) -> bool {
!self.reader.get_pointer_field(0).is_null()
}
Expand Down
129 changes: 107 additions & 22 deletions capnpc/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,28 @@ fn get_params(ctx: &GeneratorContext, mut node_id: u64) -> ::capnp::Result<Vec<S
Ok(result)
}

fn set_default(
reg_field: slot::Reader,
default_decl: &mut Option<FormattedText>,
ctx: &GeneratorContext,
default_name: String,
default_value: schema_capnp::value::Reader,
) -> ::capnp::Result<String> {
if reg_field.get_had_explicit_default() {
*default_decl = Some(crate::pointer_constants::word_array_declaration(
ctx,
&default_name,
::capnp::raw::get_struct_pointer_section(default_value).get(0),
crate::pointer_constants::WordArrayDeclarationOptions { public: true },
)?);
Ok(format!(
"::core::option::Option::Some(&_private::{default_name}[..])"
))
} else {
Ok("::core::option::Option::None".to_string())
}
}

//
// Returns (type, getter body, default_decl)
//
Expand Down Expand Up @@ -784,28 +806,6 @@ pub fn getter_text(
}
}

fn set_default(
reg_field: slot::Reader,
default_decl: &mut Option<FormattedText>,
ctx: &GeneratorContext,
default_name: String,
default_value: value::Reader,
) -> ::capnp::Result<String> {
if reg_field.get_had_explicit_default() {
*default_decl = Some(crate::pointer_constants::word_array_declaration(
ctx,
&default_name,
::capnp::raw::get_struct_pointer_section(default_value).get(0),
crate::pointer_constants::WordArrayDeclarationOptions { public: true },
)?);
Ok(format!(
"::core::option::Option::Some(&_private::{default_name}[..])"
))
} else {
Ok("::core::option::Option::None".to_string())
}
}

let getter_fragment = match (module_type, default) {
(type_::Void(()), value::Void(())) => {
if is_fn {
Expand Down Expand Up @@ -931,6 +931,80 @@ pub fn getter_text(
}
}

//
// Returns (type, getter body, default_decl)
// Currently only required for reader text fields.
//
pub fn secondary_getter_text(
ctx: &GeneratorContext,
field: &schema_capnp::field::Reader,
) -> ::capnp::Result<Option<(String, FormattedText, String)>> {
use capnp::schema_capnp::*;

match field.which()? {
field::Group(_) => Ok(None),
field::Slot(reg_field) => {
let raw_type = reg_field.get_type()?;
let default_value = reg_field.get_default_value()?;
let default = default_value.which()?;
let module_type = raw_type.which()?;

if let (type_::Text(()), value::Text(_)) = (module_type, default) {
let mut default_decl = None;
let offset = reg_field.get_offset() as usize;
let module_string = "Reader";
let member = camel_to_snake_case(module_string);

let default_name = format!(
"DEFAULT_{}",
snake_to_upper_case(&camel_to_snake_case(get_field_name(*field)?))
);
let should_get_option = is_option_field(*field)?;

let result_type = if should_get_option {
fmt!(ctx, "-> {capnp}::Result<Option<&'a [u8]>>")
} else {
fmt!(ctx, "-> {capnp}::Result<&'a [u8]>")
};

let default = set_default(
reg_field,
&mut default_decl,
ctx,
default_name,
default_value,
)?;

let getter_fragment = fmt!(ctx, "::core::result::Result::Ok({capnp}::text::Reader::as_bytes({capnp}::traits::FromPointerReader::get_from_pointer(&self.{member}.get_pointer_field({offset}),{default})?))");

let getter_code = if should_get_option {
Branch(vec![
Line(format!(
"if self.{member}.is_pointer_field_null({offset}) {{"
)),
indent(Line(
"core::result::Result::Ok(core::option::Option::None)".to_string(),
)),
Line("} else {".to_string()),
indent(Line(format!(
"{getter_fragment}.map(::core::option::Option::Some)"
))),
Line("}".to_string()),
])
} else {
Line(getter_fragment)
};

let getter_suffix = "as_bytes".to_string();

Ok(Some((result_type, getter_code, getter_suffix)))
} else {
Ok(None)
}
}
}
}

fn zero_fields_of_group(
ctx: &GeneratorContext,
node_id: u64,
Expand Down Expand Up @@ -2078,6 +2152,17 @@ fn generate_node(
line("}"),
]));

if let Some((ty, get, getter_suffix)) = secondary_getter_text(ctx, &field)? {
reader_members.push(Branch(vec![
line("#[inline]"),
Line(format!(
"pub fn get_{styled_name}_{getter_suffix}(self) {ty} {{"
)),
indent(get),
line("}"),
]));
}

let (ty_b, get_b, _) = getter_text(ctx, &field, false, true)?;
builder_members.push(Branch(vec![
line("#[inline]"),
Expand Down

0 comments on commit 2707372

Please sign in to comment.