morethantext/src/session2.rs

115 lines
2.9 KiB
Rust
Raw Normal View History

2025-03-02 10:36:03 -05:00
use crate::{queue::Message, Field};
use std::{
sync::mpsc::{channel, Receiver, Sender},
thread::spawn,
};
use uuid::Uuid;
#[derive(Clone)]
pub enum SessionMessage {
2025-03-02 10:36:03 -05:00
New(Field),
Validate(Option<Field>),
}
impl From<Option<Field>> for SessionMessage {
fn from(value: Option<Field>) -> Self {
SessionMessage::Validate(value)
}
}
#[cfg(test)]
2025-03-02 10:36:03 -05:00
pub mod create_session_message {
use super::*;
2025-03-02 10:36:03 -05:00
pub fn create_session_new() -> (SessionMessage, Uuid) {
let id = Uuid::new_v4();
(SessionMessage::New(id.into()), id)
}
}
#[cfg(test)]
mod sessionmessages {
use super::*;
#[test]
fn from_optional_field() {
let text = "afield";
let id = Some(text.into());
match id.into() {
2025-03-02 10:36:03 -05:00
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 {
2025-03-02 10:36:03 -05:00
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 super::*;
2025-03-02 10:36:03 -05:00
use std::time::Duration;
#[test]
fn gets_registered() {
let (tx, rx) = channel();
Session::start(tx);
match rx.recv().unwrap() {
2025-03-02 10:36:03 -05:00
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() {
2025-03-02 10:36:03 -05:00
Message::SessMsg(data) => match data {
SessionMessage::New(_) => {}
_ => unreachable!("should have been a new session"),
},
_ => unreachable!("should have been a session message response"),
}
}
}