pub mod action; mod document; mod message; mod mtterror; mod name; mod queue; use action::{ Action, Addition, CalcValue, Calculation, DocDef, Field, FieldType, MsgAction, Operand, Query, UserAction, }; use document::{Clock, CreateDoc, Session}; use message::{wrapper::Message, MessageAction}; use queue::{ data_director::{Include, Path, RegMsg, Register}, router::Queue, }; use std::sync::mpsc::{channel, Receiver}; use uuid::Uuid; pub use mtterror::{ErrorID, MTTError}; pub use name::{Name, NameType}; #[cfg(test)] mod support_tests { use std::time::Duration; pub static TIMEOUT: Duration = Duration::from_millis(500); } #[derive(Clone)] pub struct MoreThanText { queue: Queue, } impl MoreThanText { pub fn new() -> Self { let queue = Queue::new(); Clock::start(queue.clone()); CreateDoc::start(queue.clone()); Session::start(queue.clone()); Self { queue: queue } } fn recursive_session_request( &mut self, rx: Receiver, action: MsgAction, msg: Message, ) -> Uuid { let reply = msg.response(action); self.queue.send(reply); let result = rx.recv().unwrap(); match result.get_action() { MsgAction::Records(data) => { if data.len() == 0 { self.recursive_session_request( rx, Addition::new(Session::doc_names()[0].clone()).into(), msg, ) } else { let rec = data.iter().last().unwrap(); let field = rec.get(Name::english("id")).unwrap(); match field { Field::Uuid(result) => result, _ => unreachable!("should only receive uuid"), } } } _ => unreachable!("session queries should always return"), } } pub fn validate_session(&mut self, session: Option) -> Uuid { let (tx, rx) = channel(); let sender_id = self.queue.add_sender(tx); let new_session: MsgAction = Addition::new(Session::doc_names()[0].clone()).into(); let action = match session { Some(data) => match Uuid::try_from(data.as_str()) { Ok(id) => { let mut query = Query::new(Session::doc_names()[0].clone()); let mut calc = Calculation::new(Operand::Equal); calc.add_value(CalcValue::Existing(FieldType::Uuid)) .unwrap(); calc.add_value(id).unwrap(); query.add(Name::english("id"), calc); query.into() } Err(_) => new_session, }, None => new_session, }; let doc_name = Name::english("session"); let msg = Message::new(action.clone()); let msg_id = msg.get_message_id(); let path = Path::new( Include::Just(msg_id.clone()), Include::Just(doc_name.clone().into()), Include::Just(Action::Records), ); let reg_msg = Register::new(sender_id.clone(), RegMsg::AddRoute(path)); self.queue.send(msg.forward(NameType::None, reg_msg)); rx.recv().unwrap(); // Wait for completion. let output = self.recursive_session_request(rx, action, msg); self.queue.remove_sender(&sender_id); output } pub fn request(&mut self, req: UA) -> Result where UA: Into, { Ok("something".to_string()) } pub fn get_document(&self, name: &str, id: &str) -> Result { if name == "page" { Ok("something".to_string()) } else { Err(MTTError::new(NameType::None, ErrorID::DocumentNotFound)) } } }