Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.19 KB | None | 0 0
  1. use std::borrow::Cow;
  2.  
  3. pub struct Controller<'a, I: Internals> {
  4. state: ControllerState<'a>,
  5. internals: I,
  6. }
  7.  
  8. impl<'a, I: Internals> Controller<'a, I> {
  9. pub fn build(internals: I) -> Builder<I> {
  10. Builder { internals }
  11. }
  12.  
  13. pub fn internals(&self) -> &I {
  14. &self.internals
  15. }
  16.  
  17. pub fn do_something(&mut self) -> String {
  18. self.internals.update_things(&mut UpdateThingsEvent {
  19. state: &mut self.state,
  20. });
  21.  
  22. self.state.things.join(", ")
  23. }
  24. }
  25.  
  26. pub struct ControllerState<'a> {
  27. things: Vec<Cow<'a, str>>,
  28. }
  29.  
  30. impl<'a> ControllerState<'a> {
  31. pub fn things_mut(&mut self) -> &mut Vec<Cow<'a, str>> {
  32. &mut self.things
  33. }
  34. }
  35.  
  36. pub struct Builder<I: Internals> {
  37. internals: I,
  38. }
  39.  
  40. impl<I: Internals> Builder<I> {
  41. pub fn finalize<'a>(self) -> Controller<'a, I> {
  42. let Self { internals } = self;
  43.  
  44. Controller {
  45. internals,
  46. state: ControllerState {
  47. things: Vec::new(),
  48. },
  49. }
  50. }
  51. }
  52.  
  53. pub trait Internals {
  54. fn update_things(&mut self, state: &mut UpdateThingsEvent) {
  55. state.state.things_mut().push("thing".into());
  56. }
  57. }
  58.  
  59. pub struct UpdateThingsEvent<'a> {
  60. state: &'a mut ControllerState<'a>,
  61. }
  62.  
  63. impl<'a> UpdateThingsEvent<'a> {
  64. pub fn state(&mut self) -> &'a mut ControllerState {
  65. self.state
  66. }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement