Skip to content

Commit 0251b05

Browse files
committed
Allow unquoted expressions in default = ...
For backwards compatibility, strings are still interpreted as code inside a string. Fixes #330
1 parent 1203dfa commit 0251b05

File tree

3 files changed

+17
-7
lines changed

3 files changed

+17
-7
lines changed

derive_builder/tests/custom_default.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ mod field_level {
88
required: String,
99
#[builder(default)]
1010
explicit_default: String,
11-
#[builder(default = "\"foo\".to_string()")]
11+
#[builder(default = "foo".to_string())]
1212
escaped_default: String,
13-
#[builder(default = r#"format!("Hello {}!", "World")"#)]
13+
#[builder(default = format!("Hello {}!", "World"))]
1414
raw_default: String,
15-
#[builder(default = r#"format!("{}-{}-{}-{}",
15+
#[builder(default = {format!("{}-{}-{}-{}",
1616
Clone::clone(self.required
1717
.as_ref()
1818
.ok_or_else(|| UninitializedFieldError::new("required"))?),
1919
match self.explicit_default { Some(ref x) => x, None => "EMPTY" },
2020
self.escaped_default.as_ref().map(|x| x.as_ref()).unwrap_or("EMPTY"),
21-
if let Some(ref x) = self.raw_default { x } else { "EMPTY" })"#)]
21+
if let Some(ref x) = self.raw_default { x } else { "EMPTY" })})]
2222
computed_default: String,
2323
}
2424

@@ -72,9 +72,9 @@ mod field_level {
7272

7373
mod struct_level {
7474
#[derive(Debug, Clone, PartialEq, Eq, Builder)]
75-
#[builder(default = "explicit_default()")]
75+
#[builder(default = explicit_default())]
7676
struct Lorem {
77-
#[builder(default = "true")]
77+
#[builder(default = true)]
7878
overwritten: bool,
7979
not_type_default: Option<&'static str>,
8080
}

derive_builder/tests/validation.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ pub struct Lorem {
88
my_effort: u8,
99

1010
/// A percentile. Must be less than or equal to `Lorem::my_effort`.
11-
#[builder(default = "40")]
11+
#[builder(default = 40)]
1212
their_effort: u8,
1313

1414
/// A percentile. Must be between 0 and 100.

derive_builder_core/src/default_expression.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ impl darling::FromMeta for DefaultExpression {
4141
Ok(DefaultExpression::Trait)
4242
}
4343

44+
fn from_expr(expr: &syn::Expr) -> darling::Result<Self> {
45+
if let syn::Expr::Lit(el) = expr {
46+
if let syn::Lit::Str(_) = el.lit {
47+
return Self::from_value(&el.lit);
48+
}
49+
}
50+
51+
Ok(Self::Explicit(expr.clone().into()))
52+
}
53+
4454
fn from_value(value: &syn::Lit) -> darling::Result<Self> {
4555
Ok(Self::Explicit(BlockContents::from_value(value)?))
4656
}

0 commit comments

Comments
 (0)