/// Handle #[uniffi(...)] attributes for records #[derive(Clone, Default)] pubstruct RecordAttr { pub name: Option<String>,
}
impl UniffiAttributeArgs for RecordAttr { fn parse_one(input: ParseStream<'_>) -> syn::Result<Self> { let lookahead = input.lookahead1(); if lookahead.peek(kw::name) { let _: kw::name = input.parse()?; let _: Token![=] = input.parse()?; let name = Some(input.parse::<LitStr>()?.value());
Ok(Self { name })
} else {
Err(syn::Error::new(
input.span(),
format!("attribute `{input}` is not supported here."),
))
}
}
/// Stores parsed data from the Derive Input for the struct. struct RecordItem {
ident: Ident,
record: DataStruct,
docstring: String,
attr: RecordAttr,
}
impl RecordItem { fn new(input: DeriveInput) -> syn::Result<Self> { let record = match input.data {
Data::Struct(s) => s,
_ => { return Err(syn::Error::new(
Span::call_site(), "This derive must only be used on structs",
));
}
}; let attr = input.attrs.parse_uniffi_attr_args::<RecordAttr>()?;
Ok(Self {
ident: input.ident,
record,
docstring: extract_docstring(&input.attrs)?,
attr,
})
}
fn record_meta_static_var(record: &RecordItem) -> syn::Result<TokenStream> { let name = &record.foreign_name(); let docstring = record.docstring(); let fields_len = try_metadata_value_from_usize(
record.struct_().fields.len(), "UniFFI limits structs to 256 fields",
)?;
let concat_fields: TokenStream = record
.struct_()
.fields
.iter()
.map(|f| { let attrs = f
.attrs
.parse_uniffi_attr_args::<FieldAttributeArguments>()?;
let name = ident_to_string(f.ident.as_ref().unwrap()); let docstring = extract_docstring(&f.attrs)?; let default = default_value_metadata_calls(&attrs.default)?; let type_id_meta = ffiops::type_id_meta(&f.ty);
// Note: fields need to implement both `Lower` and `Lift` to be used in a record. The // TYPE_ID_META should be the same for both traits.
Ok(quote! {
.concat_str(#name)
.concat(#type_id_meta) #default
.concat_long_str(#docstring)
})
})
.collect::<syn::Result<_>>()?;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.