Guest User

Untitled

a guest
Oct 18th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. #[derive(Debug)]
  2. struct Email<'a>(&'a str);
  3.  
  4. #[derive(Debug)]
  5. struct Postal<'a>(&'a str);
  6.  
  7. #[derive(Debug)]
  8. struct Name<'a>(&'a str);
  9.  
  10. #[derive(Debug)]
  11. enum ContactInfo<'a> {
  12. EmailOnly(Email<'a>),
  13. PostalOnly(Postal<'a>),
  14. EmailAndPostal(Email<'a>, Postal<'a>),
  15. }
  16.  
  17. // allow `EmailOnly` instead of `ContactInfo::EmailOnly`
  18. use self::ContactInfo::*;
  19.  
  20. #[derive(Debug)]
  21. struct Contact<'a> {
  22. name: Name<'a>,
  23. contact_info: ContactInfo<'a>,
  24. }
  25.  
  26. impl<'a> Contact<'a> {
  27. fn with_postal(self, postal: Postal<'a>) -> Self {
  28. let name = self.name;
  29. let contact_info = match self.contact_info {
  30. EmailOnly(email) => EmailAndPostal(email, postal),
  31. PostalOnly(_) => PostalOnly(postal),
  32. EmailAndPostal(email, _) => EmailAndPostal(email, postal),
  33. };
  34.  
  35. Contact { name, contact_info }
  36. }
  37. }
  38.  
  39. impl<'a> From<(Name<'a>, Postal<'a>)> for Contact<'a> {
  40. fn from(contact: (Name<'a>, Postal<'a>)) -> Self {
  41. let (name, postal) = contact;
  42. let contact_info = PostalOnly(postal);
  43.  
  44. Contact { name, contact_info }
  45. }
  46. }
  47.  
  48. impl<'a> From<(Name<'a>, Email<'a>)> for Contact<'a> {
  49. fn from(contact: (Name<'a>, Email<'a>)) -> Self {
  50. let (name, email) = contact;
  51. let contact_info = EmailOnly(email);
  52.  
  53. Contact { name, contact_info }
  54. }
  55. }
  56.  
  57. impl<'a> From<(Name<'a>, Email<'a>, Postal<'a>)> for Contact<'a> {
  58. fn from(contact: (Name<'a>, Email<'a>, Postal<'a>)) -> Self {
  59. let (name, email, postal) = contact;
  60. let contact_info = EmailAndPostal(email, postal);
  61.  
  62. Contact { name, contact_info }
  63. }
  64. }
  65.  
  66. fn main() {
  67. let name = "Bart Simpson";
  68. let postal = "742 Evergreen Terrace";
  69. let email = "bart@simpsons.fam";
  70.  
  71. let postal_only = Contact::from((Name(name), Postal(postal)));
  72. println!("{:?}", postal_only);
  73.  
  74. let email_only = Contact::from((Name(name), Email(email)));
  75. println!("{:?}", email_only);
  76.  
  77. let email_and_postal = email_only.with_postal(Postal(postal));
  78. println!("{:?}", email_and_postal);
  79.  
  80. let email_and_postal = Contact::from((Name(name), Email(email), Postal(postal)));
  81. println!("{:?}", email_and_postal);
  82. }
Add Comment
Please, Sign In to add comment