fix formatted strings in components

This commit is contained in:
Evan Almloff committed 2024-01-16 12:47:23 -06:00
1 parent 407a82588a
commit 90d0164b9e
8 files changed
+41 -59

No files matched your search

@@ -261,11 +261,8 @@ fn get_function(component_body: &ComponentBody) -> ItemFn {
let mut pat = pat.clone();
// rip off mutability, but still write it out eventually
match pat.as_mut() {
Pat::Ident(ref mut pat_ident) => {
pat_ident.mutability = None;
}
_ => {}
if let Pat::Ident(ref mut pat_ident) = pat.as_mut() {
pat_ident.mutability = None;
}
Some(quote!(mut #pat))
+21 -1
View File
@@ -173,7 +173,7 @@ mod field_info {
use quote::quote;
use syn::spanned::Spanned;
use syn::{parse::Error, punctuated::Punctuated};
use syn::{Expr, Path};
use syn::{parse_quote, Expr, Path};
use super::util::{
expr_to_single_string, ident_to_type, path_to_single_string, strip_raw_ident_prefix,
@@ -204,6 +204,15 @@ mod field_info {
);
}
// String fields automatically use impl Display
if field.ty == parse_quote!(::std::string::String)
|| field.ty == parse_quote!(std::string::String)
|| field.ty == parse_quote!(string::String)
|| field.ty == parse_quote!(String)
{
builder_attr.from_displayable = true;
}
// extended field is automatically empty
if !builder_attr.extends.is_empty() {
builder_attr.default = Some(
@@ -263,6 +272,7 @@ mod field_info {
pub doc: Option<syn::Expr>,
pub skip: bool,
pub auto_into: bool,
pub from_displayable: bool,
pub strip_option: bool,
pub ignore_option: bool,
pub extends: Vec<Path>,
@@ -412,6 +422,7 @@ mod field_info {
handle_fields!(
"skip", skip, "skipped";
"into", auto_into, "calling into() on the argument";
"displayable", from_displayable, "calling to_string() on the argument";
"strip_option", strip_option, "putting the argument in Some(...)";
)
}
@@ -443,6 +454,10 @@ mod field_info {
self.auto_into = false;
Ok(())
}
"displayable" => {
self.from_displayable = false;
Ok(())
}
"optional" => {
self.strip_option = false;
self.ignore_option = true;
@@ -954,6 +969,11 @@ Finally, call `.build()` to create the instance of `{name}`.
quote!(impl ::core::convert::Into<#arg_type>),
quote!(#field_name.into()),
)
} else if field.builder_attr.from_displayable {
(
quote!(impl ::core::fmt::Display),
quote!(#field_name.to_string()),
)
} else {
(quote!(#arg_type), quote!(#field_name))
};