Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #[derive(Debug)]
- struct Email<'a>(&'a str);
- #[derive(Debug)]
- struct Postal<'a>(&'a str);
- #[derive(Debug)]
- struct Name<'a>(&'a str);
- #[derive(Debug)]
- enum ContactInfo<'a> {
- EmailOnly(Email<'a>),
- PostalOnly(Postal<'a>),
- EmailAndPostal(Email<'a>, Postal<'a>),
- }
- // allow `EmailOnly` instead of `ContactInfo::EmailOnly`
- use self::ContactInfo::*;
- #[derive(Debug)]
- struct Contact<'a> {
- name: Name<'a>,
- contact_info: ContactInfo<'a>,
- }
- impl<'a> Contact<'a> {
- fn with_postal(self, postal: Postal<'a>) -> Self {
- let name = self.name;
- let contact_info = match self.contact_info {
- EmailOnly(email) => EmailAndPostal(email, postal),
- PostalOnly(_) => PostalOnly(postal),
- EmailAndPostal(email, _) => EmailAndPostal(email, postal),
- };
- Contact { name, contact_info }
- }
- }
- impl<'a> From<(Name<'a>, Postal<'a>)> for Contact<'a> {
- fn from(contact: (Name<'a>, Postal<'a>)) -> Self {
- let (name, postal) = contact;
- let contact_info = PostalOnly(postal);
- Contact { name, contact_info }
- }
- }
- impl<'a> From<(Name<'a>, Email<'a>)> for Contact<'a> {
- fn from(contact: (Name<'a>, Email<'a>)) -> Self {
- let (name, email) = contact;
- let contact_info = EmailOnly(email);
- Contact { name, contact_info }
- }
- }
- impl<'a> From<(Name<'a>, Email<'a>, Postal<'a>)> for Contact<'a> {
- fn from(contact: (Name<'a>, Email<'a>, Postal<'a>)) -> Self {
- let (name, email, postal) = contact;
- let contact_info = EmailAndPostal(email, postal);
- Contact { name, contact_info }
- }
- }
- fn main() {
- let name = "Bart Simpson";
- let postal = "742 Evergreen Terrace";
- let email = "bart@simpsons.fam";
- let postal_only = Contact::from((Name(name), Postal(postal)));
- println!("{:?}", postal_only);
- let email_only = Contact::from((Name(name), Email(email)));
- println!("{:?}", email_only);
- let email_and_postal = email_only.with_postal(Postal(postal));
- println!("{:?}", email_and_postal);
- let email_and_postal = Contact::from((Name(name), Email(email), Postal(postal)));
- println!("{:?}", email_and_postal);
- }
Add Comment
Please, Sign In to add comment