Guest User

Untitled

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