Skip to content

Commit d8a3e65

Browse files
authored
Version 1.3 (#4)
* feat: add custom builder name support - Add `#[builder(builder_name = "...")]` attribute to customize builder name - Keep default naming convention `{StructName}Builder` - Add test cases * update version * update readme * rename into name
1 parent 7187d6b commit d8a3e65

File tree

8 files changed

+67
-9
lines changed

8 files changed

+67
-9
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "typesafe_builder"
3-
version = "1.2.0"
3+
version = "1.3.0"
44
edition = "2024"
55
authors = ["tomoikey"]
66
readme = "README.md"
@@ -10,4 +10,4 @@ license = "MIT"
1010
description = "A procedural macro to generate type-safe builder patterns for Rust structs"
1111

1212
[dependencies]
13-
typesafe_builder_derive = "1.2.0"
13+
typesafe_builder_derive = "1.3.0"

README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,24 @@ let db = DatabaseBuilder::new()
217217
.build();
218218
```
219219

220+
### 5️⃣ **Custom Builder Name**
221+
222+
```rust
223+
use typesafe_builder::*;
224+
225+
#[derive(Builder)]
226+
#[builder(name = "MyCustomBuilder")] // Customize the builder name
227+
struct User {
228+
#[builder(required)]
229+
name: String,
230+
}
231+
232+
// Use the customized builder name
233+
let user = MyCustomBuilder::new()
234+
.with_name("Alice".to_string())
235+
.build();
236+
```
237+
220238
## 🔧 Error Handling
221239

222240
### Compile-Time Error Examples

typesafe_builder_derive/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

typesafe_builder_derive/Cargo.toml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "typesafe_builder_derive"
3-
version = "1.2.0"
3+
version = "1.3.0"
44
edition = "2024"
55
authors = ["tomoikey"]
66
readme = "README.md"
@@ -13,10 +13,10 @@ description = "A procedural macro to generate type-safe builder patterns for Rus
1313
proc-macro = true
1414

1515
[dependencies]
16-
syn = { version = "2", features = ["derive", "parsing", "proc-macro"] }
17-
quote = "1"
18-
darling = "0.20"
19-
proc-macro2 = "1"
16+
darling = "0.20.11"
17+
proc-macro2 = "1.0.95"
18+
syn = { version = "2.0.101", features = ["derive", "parsing", "proc-macro"] }
19+
quote = "1.0.40"
2020

2121
[dev-dependencies]
2222
trybuild = "1.0.105"

typesafe_builder_derive/README.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,24 @@ let db = DatabaseBuilder::new()
217217
.build();
218218
```
219219

220+
### 5️⃣ **Custom Builder Name**
221+
222+
```rust
223+
use typesafe_builder::*;
224+
225+
#[derive(Builder)]
226+
#[builder(name = "MyCustomBuilder")] // Customize the builder name
227+
struct User {
228+
#[builder(required)]
229+
name: String,
230+
}
231+
232+
// Use the customized builder name
233+
let user = MyCustomBuilder::new()
234+
.with_name("Alice".to_string())
235+
.build();
236+
```
237+
220238
## 🔧 Error Handling
221239

222240
### Compile-Time Error Examples

typesafe_builder_derive/src/derive_builder.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use validate_condition::validate_condition_fields;
1414

1515
pub fn derive_builder_impl(input: Input) -> Result<TokenStream2, darling::Error> {
1616
let name = input.ident();
17-
let builder_name = Ident::new(&format!("{}Builder", name), name.span());
17+
let builder_name = Ident::new(&input.builder_name(), name.span());
1818
let generics = input.generics();
1919

2020
let field_infos = extract_field_infos(&input)?;

typesafe_builder_derive/src/input.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ pub struct Input {
77
ident: Ident,
88
generics: Generics,
99
data: darling::ast::Data<(), InputField>,
10+
#[darling(rename = "name")]
11+
builder_name: Option<String>,
1012
}
1113

1214
impl Input {
@@ -21,6 +23,12 @@ impl Input {
2123
pub fn data(&self) -> darling::ast::Data<&(), &InputField> {
2224
self.data.as_ref()
2325
}
26+
27+
pub fn builder_name(&self) -> String {
28+
self.builder_name
29+
.clone()
30+
.unwrap_or_else(|| format!("{}Builder", self.ident))
31+
}
2432
}
2533

2634
#[derive(Debug, FromField)]

typesafe_builder_derive/tests/derive_builder.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,17 @@ fn generic_struct_where_clause_success() {
191191
.build();
192192
assert_eq!(container.value, "hello");
193193
}
194+
195+
#[test]
196+
fn custom_builder_name_success() {
197+
#[derive(Builder, PartialEq)]
198+
#[builder(name = "MyCustomBuilder")]
199+
struct User {
200+
#[builder(required)]
201+
name: String,
202+
}
203+
let user = MyCustomBuilder::new()
204+
.with_name("Alice".to_string())
205+
.build();
206+
assert_eq!(user.name, "Alice");
207+
}

0 commit comments

Comments
 (0)