Guest User

Untitled

a guest
Jun 30th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.47 KB | None | 0 0
  1. extern crate uuid;
  2.  
  3. // we create a namespace to enforce that I can't create an authenticated user
  4. // by directly calling it (session is not public so you can't set it)
  5. mod users {
  6. use uuid::Uuid;
  7.  
  8. pub struct UnauthenticatedUser {
  9. pub name: String,
  10. }
  11.  
  12. pub struct AuthenticatedUser {
  13. pub name: String,
  14. _session: String,
  15. }
  16.  
  17. impl UnauthenticatedUser {
  18. pub fn authenticate(self, _password: String) -> AuthenticatedUser {
  19. // check auth, if successful create an authenticated user with session
  20. AuthenticatedUser {
  21. name: self.name,
  22. _session: format!("{}", Uuid::new_v4())
  23. }
  24. }
  25. }
  26.  
  27. impl AuthenticatedUser {
  28. pub fn do_stuff(&self) {
  29. //does something that only authenticated users can do
  30. }
  31.  
  32. pub fn logout(self) -> UnauthenticatedUser {
  33. UnauthenticatedUser {
  34. name: self.name
  35. }
  36. }
  37. }
  38. }
  39.  
  40. use users::*;
  41.  
  42. fn main() {
  43. // create a user
  44. let user = UnauthenticatedUser {
  45. name: String::from("d0nut")
  46. };
  47.  
  48. // sign in
  49. let authenticated_user = user.authenticate(String::from("hunter2"));
  50.  
  51. // do some cool authenticated user stuff
  52. authenticated_user.do_stuff();
  53.  
  54. // sign out; `authenticated_user` shouldn't be accessible anymore
  55. authenticated_user.logout();
  56.  
  57. // this line can't compile because we logged the user out ;)
  58. authenticated_user.do_stuff();
  59. }
Add Comment
Please, Sign In to add comment