use type_state_builder::TypeStateBuilder;
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(impl_into)]
struct StructLevelImplInto {
#[builder(required)]
name: String,
#[builder(required)]
email: String,
age: Option<u32>,
}
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(impl_into)]
struct FieldLevelOverrides {
#[builder(required)]
name: String,
#[builder(required, impl_into = false)]
id: String,
#[builder(impl_into = true)]
description: Option<String>,
#[builder(impl_into = false)]
category: Option<String>, }
#[derive(TypeStateBuilder, Debug, PartialEq)]
#[builder(impl_into)]
struct RegularBuilderImplInto {
name: String, email: String, age: Option<u32>,
}
#[test]
fn test_struct_level_impl_into_basic() {
let user = StructLevelImplInto::builder()
.name("Alice") .email("alice@example.com") .age(Some(30))
.build();
assert_eq!(user.name, "Alice");
assert_eq!(user.email, "alice@example.com");
assert_eq!(user.age, Some(30));
}
#[test]
fn test_struct_level_impl_into_string_variants() {
let owned_name = "Bob".to_string();
let borrowed_email = "bob@example.com";
let user = StructLevelImplInto::builder()
.name(owned_name.clone()) .email(borrowed_email) .build();
assert_eq!(user.name, "Bob");
assert_eq!(user.email, "bob@example.com");
assert_eq!(user.age, None);
}
#[test]
fn test_field_level_overrides() {
let user = FieldLevelOverrides::builder()
.name("Charlie") .id("user123".to_string()) .description(Some("Test user".to_string())) .category(Some("admin".to_string())) .build();
assert_eq!(user.name, "Charlie");
assert_eq!(user.id, "user123");
assert_eq!(user.description, Some("Test user".to_string()));
assert_eq!(user.category, Some("admin".to_string()));
}
#[test]
fn test_regular_builder_impl_into() {
let user = RegularBuilderImplInto::builder()
.name("Diana") .email("diana@example.com") .age(Some(28))
.build();
assert_eq!(user.name, "Diana");
assert_eq!(user.email, "diana@example.com");
assert_eq!(user.age, Some(28));
}
#[test]
fn test_no_impl_into_still_works() {
#[derive(TypeStateBuilder, Debug, PartialEq)]
struct NoImplInto {
#[builder(required)]
name: String,
age: Option<u32>,
}
let user = NoImplInto::builder()
.name("Eve".to_string()) .age(Some(25))
.build();
assert_eq!(user.name, "Eve");
assert_eq!(user.age, Some(25));
}