Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.26 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. // TODO: how do we have a method here that references internals?
  36. }
  37.  
  38. pub struct Builder<I: Internals> {
  39. internals: I,
  40. }
  41.  
  42. impl<I: Internals> Builder<I> {
  43. pub fn finalize<'a>(self) -> Controller<'a, I> {
  44. let Self { internals } = self;
  45.  
  46. Controller {
  47. internals,
  48. state: ControllerState {
  49. things: Vec::new(),
  50. },
  51. }
  52. }
  53. }
  54.  
  55. pub trait Internals {
  56. fn update_things(&mut self, _state: &mut UpdateThingsEvent) {
  57. _state.state.things_mut().push("lightship-thing".into());
  58. }
  59. }
  60.  
  61. pub struct UpdateThingsEvent<'a> {
  62. state: &'a mut ControllerState<'a>,
  63. }
  64.  
  65. impl<'a> UpdateThingsEvent<'a> {
  66. pub fn state(&mut self) -> &'a mut ControllerState {
  67. self.state
  68. }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement