diff --git a/src/adaptors.rs b/src/adaptors.rs index 4413dd8..9b9dd7f 100644 --- a/src/adaptors.rs +++ b/src/adaptors.rs @@ -1,4 +1,4 @@ -use crate::{TallyState,Channel}; +use crate::{TallyState, Channel}; use std::sync::mpsc; use std::sync::mpsc::{Sender, Receiver}; use std::thread; @@ -40,10 +40,9 @@ impl Adaptor for FakeAdaptor { fn run(&mut self) -> Receiver { println!("arse"); let (tx, rx): (Sender, Receiver) = mpsc::channel(); - let thread_tx = tx.clone(); let thread_numchannels = self.numchannels.clone(); self.thread = Some(thread::spawn(move || { - FakeAdaptor::_run(thread_numchannels, thread_tx); + FakeAdaptor::_run(thread_numchannels, tx); })); return rx; } diff --git a/src/drivers.rs b/src/drivers.rs new file mode 100644 index 0000000..7009c37 --- /dev/null +++ b/src/drivers.rs @@ -0,0 +1,40 @@ +use crate::TallyState; + +use std::sync::mpsc; +use std::sync::mpsc::{Sender, Receiver}; +use std::thread; + +/// A Driver displays the Tallies on a physical tally system. +pub trait Driver { + /// Run the driver, returning a channel sender which takes TallyStates + fn run(&mut self) -> Sender; +} + +pub struct FakeDriver { + thread: Option> +} + +impl Driver for FakeDriver { + fn run(&mut self) -> Sender { + let (tx, rx): (Sender, Receiver) = mpsc::channel(); + self.thread = Some(thread::spawn(move || { + FakeDriver::_run(rx); + })); + return tx; + } +} + +impl FakeDriver { + pub fn new() -> FakeDriver { + FakeDriver{ + thread: None + } + } + + fn _run(rx: Receiver) { + loop { + let state = rx.recv().unwrap(); + println!("{}", state); + } + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index cf537c1..47936b4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,11 @@ mod adaptors; +mod drivers; use crate::adaptors::{Adaptor,FakeAdaptor}; +use crate::drivers::{Driver, FakeDriver}; use std::fmt; #[derive(Clone)] -pub struct Channel(Option); +pub struct Channel (Option); #[derive(Clone)] pub struct TallyState { @@ -26,16 +28,17 @@ impl fmt::Display for TallyState { } } -struct Server { +struct Server { adaptor: T, + driver: U, } -impl Server { +impl Server { fn run(&mut self) { let rx = self.adaptor.run(); + let tx = self.driver.run(); loop{ - let newstate = rx.recv().unwrap(); - println!("{}", newstate); + tx.send(rx.recv().unwrap()).unwrap(); } } } @@ -43,6 +46,7 @@ impl Server { fn main() { let mut s = Server{ adaptor: FakeAdaptor::new(8), + driver: FakeDriver::new(), }; s.run();