use crate::encode::Encode;
use alloc::boxed::Box;
use alloc::string::String;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum Request {
Cheat(i32, i32),
Stats(bool),
AppId,
Screenshot,
Launch((String, String)),
Exit,
Buttons(u8),
Data(Box<[u8]>),
}
impl Encode<'_> for Request {}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum Response {
Cheat(i32),
Fuel(Callback, Fuel),
CPU(CPU),
Memory(Memory),
Log(String),
AppID((String, String)),
Ok,
}
impl Encode<'_> for Response {}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub enum Callback {
Boot,
Update,
Render,
RenderLine,
Cheat,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct Fuel {
pub min: u32,
pub max: u32,
pub mean: u32,
pub var: f32,
pub calls: u32,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct Memory {
pub pages: u16,
pub last_one: u32,
pub reads: u32,
pub writes: u32,
pub max: u32,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct CPU {
pub busy_ns: u32,
pub lag_ns: u32,
pub total_ns: u32,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_roundtrip_request() {
let given = Request::Cheat(3, 4);
let mut buf = vec![0; given.size()];
let raw = given.encode_buf(&mut buf).unwrap();
let actual = Request::decode(raw).unwrap();
assert_eq!(given, actual);
}
#[test]
fn test_roundtrip_response() {
let given = Response::Cheat(13);
let mut buf = vec![0; given.size()];
let raw = given.encode_buf(&mut buf).unwrap();
let actual = Response::decode(raw).unwrap();
assert_eq!(given, actual);
}
}