|
@@ -0,0 +1,57 @@
|
|
|
+use std::io;
|
|
|
+use core::fmt::Debug;
|
|
|
+
|
|
|
+#[derive(Debug)]
|
|
|
+pub struct InputProviderError {
|
|
|
+ pub msg: String
|
|
|
+}
|
|
|
+
|
|
|
+pub trait InputProvider {
|
|
|
+ fn get_input(&mut self) -> Result<i32, InputProviderError>;
|
|
|
+}
|
|
|
+
|
|
|
+pub struct NullProvider {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+impl InputProvider for NullProvider {
|
|
|
+ fn get_input(&mut self) -> Result<i32, InputProviderError> {
|
|
|
+ panic!("This method deliberately not implemented")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+struct ConsoleProvider {
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+impl Debug for dyn InputProvider {
|
|
|
+ fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
|
|
+ write!(f, "InputProvider")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl InputProvider for ConsoleProvider {
|
|
|
+ fn get_input(&mut self) -> Result<i32, InputProviderError> {
|
|
|
+ let mut user_input = String::new();
|
|
|
+ let stdin = io::stdin(); // We get `Stdin` here.
|
|
|
+ stdin.read_line(&mut user_input).unwrap();
|
|
|
+ Ok(user_input.parse().unwrap())
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+struct TestProvder {
|
|
|
+ queued: Vec<i32>,
|
|
|
+ idx: usize
|
|
|
+}
|
|
|
+
|
|
|
+impl InputProvider for TestProvder {
|
|
|
+ fn get_input(&mut self) -> Result<i32, InputProviderError> {
|
|
|
+ if self.idx >= self.queued.len() {
|
|
|
+ Err(InputProviderError{msg: "out of queued inputs".to_string()})
|
|
|
+ } else {
|
|
|
+ let res = self.queued[self.idx];
|
|
|
+ self.idx += 1;
|
|
|
+ return Ok(res);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|