#builder-pattern #fundamental #general-purpose

no-std former_types

A flexible implementation of the Builder pattern supporting nested builders and collection-specific subformers. Its compile-time structures and traits that are not generated but reused.

8 stable releases

2.8.0 Sep 5, 2024
2.7.0 Jul 13, 2024
2.6.0 Jun 29, 2024
2.2.0 May 30, 2024

#2227 in Algorithms

Download history 92/week @ 2024-07-01 183/week @ 2024-07-08 72/week @ 2024-07-15 51/week @ 2024-07-22 37/week @ 2024-07-29 42/week @ 2024-08-05 102/week @ 2024-08-12 687/week @ 2024-08-19 1976/week @ 2024-08-26 1426/week @ 2024-09-02 1443/week @ 2024-09-09 204/week @ 2024-09-16 142/week @ 2024-09-23 229/week @ 2024-09-30 206/week @ 2024-10-07 189/week @ 2024-10-14

770 downloads per month
Used in 35 crates (5 directly)

MIT license

175KB
2.5K SLoC

Module :: former_types

experimental rust-status docs.rs Open in Gitpod discord

A flexible implementation of the Builder pattern supporting nested builders and collection-specific subformers. Its compile-time structures and traits that are not generated but reused.

Example: Using Trait Assign

Demonstrates setting various components (fields) of a struct.

The former_types crate provides a generic interface for setting components on an object. This example defines a Person struct and implements the Assign trait for its fields. It shows how to use these implementations to set the fields of a Person instance using different types that can be converted into the required types.

#[ cfg( any( not( feature = "types_former" ), not( feature = "enabled" ) ) ) ]
fn main() {}

#[ cfg( all( feature = "types_former", feature = "enabled" ) ) ]
fn main()
{
  use former_types::Assign;

  #[ derive( Default, PartialEq, Debug ) ]
  struct Person
  {
    age : i32,
    name : String,
  }

  impl< IntoT > Assign< i32, IntoT > for Person
  where
    IntoT : Into< i32 >,
  {
    fn assign( &mut self, component : IntoT )
    {
      self.age = component.into();
    }
  }

  impl< IntoT > Assign< String, IntoT > for Person
  where
    IntoT : Into< String >,
  {
    fn assign( &mut self, component : IntoT )
    {
      self.name = component.into();
    }
  }

  let mut got : Person = Default::default();
  got.assign( 13 );
  got.assign( "John" );
  assert_eq!( got, Person { age : 13, name : "John".to_string() } );
  dbg!( got );
  // > Person {
  // >   age: 13,
  // >   name: "John",
  // > }

}

Try out cargo run --example former_types_trivial.
See code.

Dependencies

~0–380KB