use actm::prelude::*;
use nanorand::Rng;
use crate::{Answers, Test};
pub struct StudentContext {
pub name: String,
}
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub struct StudentInput {
pub test: Test,
}
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
pub struct StudentOutput {
pub answers: Answers,
pub name: String,
}
wrapped_event!(StudentInputEvent, StudentInput);
wrapped_event!(StudentOutputEvent, StudentOutput);
async fn student_event_handler(
context: StudentContext,
event: StudentInputEvent,
) -> (StudentContext, Option<StudentOutputEvent>) {
let mut rng = nanorand::tls_rng();
let results = event
.into_inner()
.test
.questions
.into_iter()
.map(|x| -> bool { x > rng.generate_range(1_u32..=100) })
.collect::<Vec<_>>();
let name = context.name.clone();
let new_event: StudentOutputEvent = StudentOutput {
answers: Answers { answers: results },
name,
}
.into();
(context, Some(new_event))
}
async_actor!(
Student,
StudentInputEvent,
StudentOutputEvent,
StudentContext,
student_event_handler
);