summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMica White <botahamec@outlook.com>2026-09-24 20:59:43 -0400
committerMica White <botahamec@outlook.com>2026-09-24 20:59:43 -0400
commita08d9f1a1afa6ec11bcb99e29b030b1d3a44b63f (patch)
tree8adc7b4c00e63a42e4d345f7b1725c81a2a0eb3f /src
parent3b1549699693504382d9162d2bb1a73ac1eeccd9 (diff)
Support base expressionsHEADmain
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 314f813..8024048 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -293,6 +293,14 @@ pub fn derive_builder(input: TokenStream) -> TokenStream {
#builder_macro
+ impl core::convert::From<#struct_name> for #builder_name<#(#trues),*> {
+ fn from(s: #struct_name) -> Self {
+ Self {
+ #(#field_names: Some(s.#field_names),)*
+ }
+ }
+ }
+
impl<#(const #const_generics: bool),*> core::default::Default for #builder_name<#(#const_generics),*> {
fn default() -> Self {
Self {
@@ -305,6 +313,10 @@ pub fn derive_builder(input: TokenStream) -> TokenStream {
#builder_visibility fn builder() -> #builder_name<#(#falses),*> {
#builder_name::default()
}
+
+ #builder_visibility fn into_builder(self) -> #builder_name<#(#trues),*> {
+ #builder_name::from(self)
+ }
}
impl<#(const #const_generics: bool),*> #builder_name<#(#const_generics),*> {
@@ -360,17 +372,28 @@ pub fn derive_builder(input: TokenStream) -> TokenStream {
pub fn build(input: TokenStream) -> TokenStream {
let structure = parse_macro_input!(input as ExprStruct);
let struct_name = &structure.path;
+ let base = &structure.rest;
let field_names = structure.fields.iter().map(|field| &field.member);
let field_values = structure.fields.iter().map(|field| &field.expr);
- quote! {
- #struct_name
- ::builder()
- #(.#field_names(#field_values))*
- .build()
+ if let Some(base) = base {
+ quote! {
+ #base
+ .into_builder()
+ #(.#field_names(#field_values))*
+ .build()
+ }
+ .into()
+ } else {
+ quote! {
+ #struct_name
+ ::builder()
+ #(.#field_names(#field_values))*
+ .build()
+ }
+ .into()
}
- .into()
}
/// Creates a declarative macro to construct a type that derives [`Builder`]