Got frontend to make a validate request.
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				MoreThanText/morethantext/pipeline/head This commit looks good
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	MoreThanText/morethantext/pipeline/head This commit looks good
				
			This commit is contained in:
		
							
								
								
									
										87
									
								
								src/frontend.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/frontend.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,87 @@
 | 
			
		||||
use crate::{
 | 
			
		||||
    Field,
 | 
			
		||||
    Request,
 | 
			
		||||
    queue::Message,
 | 
			
		||||
    session2::SessionMessage,
 | 
			
		||||
};
 | 
			
		||||
use std::{
 | 
			
		||||
    sync::mpsc::{channel, Receiver, Sender},
 | 
			
		||||
    thread::spawn,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct FrontEnd {
 | 
			
		||||
    tx: Sender<Message>,
 | 
			
		||||
    rx: Receiver<Message>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl FrontEnd {
 | 
			
		||||
    fn new(tx: Sender<Message>, rx: Receiver<Message>) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            tx: tx,
 | 
			
		||||
            rx: rx,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn start(queue_tx: Sender<Message>) {
 | 
			
		||||
        spawn(move || {
 | 
			
		||||
            let (tx, rx) = channel();
 | 
			
		||||
            let frontend = FrontEnd::new(queue_tx.clone(), rx);
 | 
			
		||||
            queue_tx.send(tx.into()).unwrap();
 | 
			
		||||
            frontend.listen();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn listen(&self) {
 | 
			
		||||
        loop {
 | 
			
		||||
            self.rx.recv().unwrap();
 | 
			
		||||
            let id: Option<Field> = None;
 | 
			
		||||
            let msg: SessionMessage = id.into();
 | 
			
		||||
            self.tx.send(msg.into()).unwrap();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod frontends {
 | 
			
		||||
    use crate::create_request::empty_request;
 | 
			
		||||
    use std::time::Duration;
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    fn run_service() -> (Sender<Message>, Receiver<Message>) {
 | 
			
		||||
        let (tx, rx) = channel();
 | 
			
		||||
        let service_tx: Sender<Message>;
 | 
			
		||||
        FrontEnd::start(tx);
 | 
			
		||||
        match rx.recv().unwrap() {
 | 
			
		||||
            Message::Register(result) => service_tx = result,
 | 
			
		||||
            _ => unreachable!("should register the service"),
 | 
			
		||||
        }
 | 
			
		||||
        (service_tx, rx)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn gets_registered() {
 | 
			
		||||
        let (tx, rx) = channel();
 | 
			
		||||
        FrontEnd::start(tx);
 | 
			
		||||
        match rx.recv().unwrap() {
 | 
			
		||||
            Message::Register(_) => {
 | 
			
		||||
            },
 | 
			
		||||
            _ => unreachable!("should register the service"),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn handle_request() {
 | 
			
		||||
        let (tx, rx) = run_service();
 | 
			
		||||
        let (req, _) = empty_request();
 | 
			
		||||
        tx.send(req.into()).unwrap();
 | 
			
		||||
        match rx.recv_timeout(Duration::from_millis(500)).unwrap() {
 | 
			
		||||
            Message::SessMsg(output) => {
 | 
			
		||||
                match output {
 | 
			
		||||
                    SessionMessage::Validate(result) => assert!(result.is_none()),
 | 
			
		||||
                    _ => unreachable!("Should have sent a val9idate"),
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            _ => unreachable!("Should have generated a session message"),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,10 +1,12 @@
 | 
			
		||||
mod client;
 | 
			
		||||
mod data;
 | 
			
		||||
mod error;
 | 
			
		||||
mod frontend;
 | 
			
		||||
mod message;
 | 
			
		||||
mod queue;
 | 
			
		||||
mod router;
 | 
			
		||||
mod session;
 | 
			
		||||
mod session2;
 | 
			
		||||
 | 
			
		||||
use client::{Client, ClientMsg};
 | 
			
		||||
use message::{Message, MsgData};
 | 
			
		||||
@@ -446,6 +448,7 @@ mod test_message {
 | 
			
		||||
 | 
			
		||||
/// Application client to MoreThanText
 | 
			
		||||
pub struct MoreThanText {
 | 
			
		||||
    // tx: Sender<Message>,
 | 
			
		||||
    session: Option<SessionData>,
 | 
			
		||||
    tx: Sender<Message>,
 | 
			
		||||
}
 | 
			
		||||
@@ -461,6 +464,11 @@ impl MoreThanText {
 | 
			
		||||
    ///  MoreThanText::new();
 | 
			
		||||
    ///  ```
 | 
			
		||||
    pub fn new() -> Self {
 | 
			
		||||
        /* Future code.
 | 
			
		||||
         * tx = Queue::start();
 | 
			
		||||
         * tx.send(Session::start().into()).unwrap();
 | 
			
		||||
         * Self { tx: tx }
 | 
			
		||||
        */
 | 
			
		||||
        let (tx, rx) = channel();
 | 
			
		||||
        let mut senders = Vec::new();
 | 
			
		||||
        senders.push(Client::start(tx.clone()));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								src/queue.rs
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								src/queue.rs
									
									
									
									
									
								
							@@ -1,13 +1,17 @@
 | 
			
		||||
use crate::Request;
 | 
			
		||||
use crate::{
 | 
			
		||||
    Request,
 | 
			
		||||
    session2::SessionMessage,
 | 
			
		||||
};
 | 
			
		||||
use std::{
 | 
			
		||||
    sync::mpsc::{channel, Receiver, Sender},
 | 
			
		||||
    thread::spawn,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#[derive(Clone)]
 | 
			
		||||
enum Message {
 | 
			
		||||
pub enum Message {
 | 
			
		||||
    Register(Sender<Message>),
 | 
			
		||||
    Req(Request),
 | 
			
		||||
    SessMsg(SessionMessage),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<Request> for Message {
 | 
			
		||||
@@ -22,10 +26,19 @@ impl From<Sender<Message>> for Message {
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<SessionMessage> for Message {
 | 
			
		||||
    fn from(value: SessionMessage) -> Self {
 | 
			
		||||
        Message::SessMsg(value)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod messages {
 | 
			
		||||
    use super::*;
 | 
			
		||||
    use crate::create_request::empty_request;
 | 
			
		||||
    use crate::{
 | 
			
		||||
        create_request::empty_request,
 | 
			
		||||
        Field,
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn from_request() {
 | 
			
		||||
@@ -51,6 +64,21 @@ mod messages {
 | 
			
		||||
            _ => unreachable!("should have been a register"),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn from_sessionmessage() {
 | 
			
		||||
        let id: Option<Field> = None;
 | 
			
		||||
        let sess_msg: SessionMessage = id.into();
 | 
			
		||||
        match sess_msg.into() {
 | 
			
		||||
            Message::SessMsg(result) => {
 | 
			
		||||
                match result {
 | 
			
		||||
                    SessionMessage::Validate(data) => assert!(data.is_none()),
 | 
			
		||||
                    _ => unreachable!("should have been a validate"),
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            _ => unreachable!("should have been a session message"),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct Queue {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										125
									
								
								src/session2.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/session2.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,125 @@
 | 
			
		||||
use crate::{
 | 
			
		||||
    Field,
 | 
			
		||||
    queue::Message,
 | 
			
		||||
};
 | 
			
		||||
use std::{
 | 
			
		||||
    sync::mpsc::{channel, Receiver, Sender},
 | 
			
		||||
    thread::spawn,
 | 
			
		||||
};
 | 
			
		||||
use uuid::Uuid;
 | 
			
		||||
 | 
			
		||||
#[derive(Clone)]
 | 
			
		||||
pub enum SessionMessage {
 | 
			
		||||
    New(Field), 
 | 
			
		||||
    Validate(Option<Field>),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl From<Option<Field>> for SessionMessage {
 | 
			
		||||
    fn from(value: Option<Field>) -> Self {
 | 
			
		||||
        SessionMessage::Validate(value)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
pub mod crete_session_message {
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    fn create_session_new() -> SessionMessage {
 | 
			
		||||
        SessionMessage::New(Uuid::new_v4().into())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod sessionmessages {
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn from_optional_field() {
 | 
			
		||||
        let text = "afield";
 | 
			
		||||
        let id = Some(text.into());
 | 
			
		||||
        match id.into() {
 | 
			
		||||
            SessionMessage::Validate(result) => {
 | 
			
		||||
                match result {
 | 
			
		||||
                    Some(data) => {
 | 
			
		||||
                        match data {
 | 
			
		||||
                            Field::Static(output) => assert_eq!(output, text),
 | 
			
		||||
                            _ => unreachable!("should have returned static text"),
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                    None => unreachable!("shoulf have returned data"),
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            _ => unreachable!("should have been a vaqlidate"),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct Session {
 | 
			
		||||
    tx: Sender<Message>,
 | 
			
		||||
    rx: Receiver<Message>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl Session {
 | 
			
		||||
    fn new(tx: Sender<Message>, rx: Receiver<Message>) -> Self {
 | 
			
		||||
        Self {
 | 
			
		||||
            tx: tx,
 | 
			
		||||
            rx: rx,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn start(queue_tx: Sender<Message>) {
 | 
			
		||||
        spawn(move || {
 | 
			
		||||
            let (tx, rx) = channel();
 | 
			
		||||
            let session = Session::new(queue_tx.clone(), rx);
 | 
			
		||||
            queue_tx.send(tx.clone().into()).unwrap();
 | 
			
		||||
            session.listen();
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn listen(&self) {
 | 
			
		||||
        loop {
 | 
			
		||||
            self.rx.recv().unwrap();
 | 
			
		||||
            let res = Uuid::nil();
 | 
			
		||||
            self.tx.send(SessionMessage::New(res.into()).into());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod sessions {
 | 
			
		||||
    use std::time::Duration;
 | 
			
		||||
    use super::*;
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn gets_registered() {
 | 
			
		||||
        let (tx, rx) = channel();
 | 
			
		||||
        Session::start(tx);
 | 
			
		||||
        match rx.recv().unwrap() {
 | 
			
		||||
            Message::Register(_) => {},
 | 
			
		||||
            _ => unreachable!("should register the service"),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn validate_none_returns_new_id() {
 | 
			
		||||
        let (tx, rx) = channel();
 | 
			
		||||
        let sender: Sender<Message>;
 | 
			
		||||
        Session::start(tx);
 | 
			
		||||
        match rx.recv().unwrap() {
 | 
			
		||||
            Message::Register(result) => sender = result,
 | 
			
		||||
            _ => unreachable!("should register the service"),
 | 
			
		||||
        }
 | 
			
		||||
        let data: Option<Field> = None;
 | 
			
		||||
        let req: SessionMessage = data.into();
 | 
			
		||||
        sender.send(req.into()).unwrap();
 | 
			
		||||
        match rx.recv_timeout(Duration::from_millis(500)).unwrap() {
 | 
			
		||||
            Message::SessMsg(data) => {
 | 
			
		||||
                match data {
 | 
			
		||||
                    SessionMessage::New(_) => {},
 | 
			
		||||
                    _ => unreachable!("should have been a new session"),
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            _ => unreachable!("should have been a session message response"),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user