Advertisement
Guest User

Untitled

a guest
Dec 18th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 2.63 KB | None | 0 0
  1. use std::io::Write;
  2. use std::rc::Rc;
  3. use std::cell::RefCell;
  4. use std::result::Result;
  5. use std::io::Error;
  6.  
  7. pub struct TestWriter {
  8.     /// Каквито полета ви трябват, но вероятно нещо, което обвива Vec<u8>
  9.     buffer: Rc<RefCell<Vec<u8>>>
  10. }
  11.  
  12. pub struct ThingThatWeAreTesting<W: Write> {
  13.     out: Rc<RefCell<W>>
  14. }
  15.  
  16. impl<W: Write> ThingThatWeAreTesting<W> {
  17.     pub fn new(out: W) -> Self {
  18.         return ThingThatWeAreTesting { out: Rc::new(RefCell::new(out)) };
  19.     }
  20.  
  21.     pub fn wake_up_neo(&mut self) {
  22.         self.out.borrow_mut().write(b"Knock, ").unwrap();
  23.     }
  24.  
  25.     pub fn the_matrix_has_you(&mut self) {
  26.         self.out.borrow_mut().write(b"knock, ").unwrap();
  27.     }
  28.  
  29.     pub fn follow_the_white_rabbit(&mut self) {
  30.         self.out.borrow_mut().write(b"Neo").unwrap();
  31.     }
  32. }
  33.  
  34. impl TestWriter {
  35.     /// Конструира нов TestWriter с празен контейнер за байтове.
  36.     ///
  37.     pub fn new() -> Self {
  38.         return TestWriter { buffer: Rc::new(RefCell::new(Vec::new()))}
  39.     }
  40.  
  41.     /// Консумира структурата и връща Vec с байтове, в който се съдържа каквото е било писано
  42.     /// чрез методите на `Write` trait-а.
  43.     ///
  44.     pub fn into_inner(self) -> Vec<u8> {
  45.         return self.buffer.borrow_mut().clone();
  46.     }
  47.  
  48.     /// Този метод съществува по-скоро за демонстрация как бихте могли удобно да използвате този
  49.     /// тип, без да жонглирате байтове. Няма да се тества, ако решите да го махнете или пренапишете
  50.     /// някак.
  51.     ///
  52.     pub fn into_string(self) -> String {
  53.         String::from_utf8(self.into_inner()).unwrap()
  54.     }
  55. }
  56.  
  57. impl Write for TestWriter {
  58.     fn write(&mut self, text: &[u8]) -> Result<usize, Error> {
  59.         for &byte in text {
  60.             self.buffer.borrow_mut().push(byte);
  61.         }
  62.  
  63.         return Ok(self.buffer.borrow_mut().len());
  64.     }
  65.  
  66.     fn flush(&mut self) -> Result<(), Error> {
  67.         return Ok(());
  68.     }
  69. }
  70.  
  71. impl Clone for TestWriter {
  72.     fn clone(&self) -> Self {
  73.         return TestWriter { buffer: Rc::clone(&self.buffer)}
  74.     }
  75. }
  76.  
  77. fn main() {
  78.     let out = TestWriter::new();
  79.     {
  80.         let mut thing = ThingThatWeAreTesting::new(out.clone());
  81.         thing.wake_up_neo();
  82.         thing.the_matrix_has_you();
  83.         thing.follow_the_white_rabbit();
  84.     }
  85.  
  86.     assert_eq!(out.into_string(), "Knock, knock, Neo");
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement