use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy)]
pub enum DetectionType {
MentalCommand,
FacialExpression,
}
impl DetectionType {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
DetectionType::MentalCommand => "mentalCommand",
DetectionType::FacialExpression => "facialExpression",
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum TrainingStatus {
Start,
Accept,
Reject,
Reset,
Erase,
}
impl TrainingStatus {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
TrainingStatus::Start => "start",
TrainingStatus::Accept => "accept",
TrainingStatus::Reject => "reject",
TrainingStatus::Reset => "reset",
TrainingStatus::Erase => "erase",
}
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct DetectionInfo {
pub actions: Vec<String>,
pub controls: Vec<String>,
pub events: Vec<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TrainedSignatureActions {
#[serde(rename = "totalTimesTraining")]
pub total_times_training: u32,
#[serde(rename = "trainedActions")]
pub trained_actions: Vec<TrainedAction>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TrainedAction {
pub action: String,
pub times: u32,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TrainingTime {
pub time: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MentalCommandTrainingThresholdRequest {
pub session_id: Option<String>,
pub profile: Option<String>,
pub status: Option<String>,
pub value: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FacialExpressionSignatureTypeRequest {
pub status: String,
pub profile: Option<String>,
pub session: Option<String>,
pub signature: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FacialExpressionThresholdRequest {
pub status: String,
pub action: String,
pub profile: Option<String>,
pub session: Option<String>,
pub value: Option<u32>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_detection_type_strings() {
assert_eq!(DetectionType::MentalCommand.as_str(), "mentalCommand");
assert_eq!(DetectionType::FacialExpression.as_str(), "facialExpression");
}
#[test]
fn test_training_status_strings() {
assert_eq!(TrainingStatus::Start.as_str(), "start");
assert_eq!(TrainingStatus::Accept.as_str(), "accept");
assert_eq!(TrainingStatus::Reject.as_str(), "reject");
assert_eq!(TrainingStatus::Reset.as_str(), "reset");
assert_eq!(TrainingStatus::Erase.as_str(), "erase");
}
#[test]
fn test_deserialize_trained_signature_actions() {
let json = r#"{
"totalTimesTraining": 15,
"trainedActions": [
{"action": "neutral", "times": 8},
{"action": "push", "times": 4},
{"action": "pull", "times": 3}
]
}"#;
let actions: TrainedSignatureActions = serde_json::from_str(json).unwrap();
assert_eq!(actions.total_times_training, 15);
assert_eq!(actions.trained_actions.len(), 3);
assert_eq!(actions.trained_actions[0].action, "neutral");
assert_eq!(actions.trained_actions[0].times, 8);
assert_eq!(actions.trained_actions[2].action, "pull");
}
#[test]
fn test_deserialize_training_time() {
let json = r#"{"time": 8.0}"#;
let tt: TrainingTime = serde_json::from_str(json).unwrap();
assert!((tt.time - 8.0).abs() < f64::EPSILON);
}
}