rust_tagged/lib.rs
1/// rust-tagged provides a simple way to define strongly typed wrappers over primitive types like String, i32, Uuid, chrono::DateTime, etc. It helps eliminate bugs caused by misusing raw primitives for conceptually distinct fields such as UserId, Email, ProductId, and more.
2///
3/// Eliminate accidental mixups between similar types (e.g. OrgId vs UserId)
4/// Enforce domain modeling in code via the type system
5/// Ergonomic .into() support for primitive conversions
6///
7/// # Example - Simple
8///
9/// ```
10/// use tagged_core::{Tagged};
11///
12/// #[derive(Debug)]
13/// struct EmailTag;
14///
15/// type Email = Tagged<String, EmailTag>;
16///
17/// fn main() {
18/// let email: Email = "test@example.com".into();
19/// println!("Email inner value: {}", email.value());
20///
21/// // Convert back to String
22/// let raw: String = email.into();
23/// println!("Raw String: {raw}");
24/// }
25/// ```
26///
27/// # Example - Debug
28/// ```
29/// use tagged_core::Tagged;
30///
31///
32/// #[derive(Debug)]
33/// struct UserIdTag {
34/// a: Tagged<u32, Self>,
35/// b: Tagged<u32, Self>,
36/// }
37///
38///
39/// fn main() {
40/// let instance = UserIdTag{a: 1.into(), b: 2.into()};
41///
42/// println!("{}", instance.a);
43/// println!("{:?}", instance.b);
44/// }
45/// ```
46///
47/// # Example - Hash
48/// ```
49/// fn main() {
50/// use tagged_core::Tagged;
51/// use std::collections::HashSet;
52///
53/// #[derive(Clone, Hash, Debug, PartialEq, Eq)]
54/// struct User {
55/// id: Tagged<String, Self>
56/// }
57/// let mut s: HashSet<User> = HashSet::new();
58/// let user = User{id: "me@example.com".into()};
59/// s.insert(user.clone());
60///
61/// assert!(s.contains(&user));
62/// }
63/// ```
64///
65/// # Example - Iter
66/// ```
67/// use tagged_core::Tagged;
68///
69/// #[derive(Debug)]
70/// struct Org;
71///
72/// type EmployeeNames = Tagged<Vec<String>, Org>;
73///
74/// fn main() {
75/// let names: EmployeeNames = Tagged::new(vec!["Alice".into(), "Bob".into()]);
76///
77/// for name in &names {
78/// println!("Name: {name}");
79/// }
80///
81/// // Consuming iterator
82/// for name in names {
83/// println!("Owned: {name}");
84/// }
85/// }
86///
87/// /*
88/// Name: Alice
89/// Name: Bob
90/// Owned: Alice
91/// Owned: Bob
92/// */
93/// ```
94///
95/// # Example - Mutation
96/// ```
97/// use tagged_core::Tagged;
98///
99/// #[derive(Debug)]
100/// struct Org;
101///
102/// type OrgName = Tagged<String, Org>;
103///
104/// fn main() {
105/// let mut name = OrgName::new("Codefonsi".into());
106///
107/// name.set("New Org Name".into());
108///
109/// println!("Updated Org Name: {}", name.value());
110/// }
111/// ```
112
113pub use tagged_core::*;