qusb2snes_client/
request.rs

1use serde::Serialize;
2
3#[derive(Debug, PartialEq, Serialize)]
4#[serde(rename_all = "PascalCase")]
5pub enum Opcode {
6  DeviceList,
7  Attach,
8  AppVersion,
9  Name,
10  Close,
11  Info,
12  Boot,
13  Menu,
14  Reset,
15  Binary,
16  Stream,
17  Fence,
18  GetAddress,
19  PutAddress,
20  PutIPS,
21  GetFile,
22  PutFile,
23  List,
24  Remove,
25  Rename,
26  MakeDir,
27}
28
29impl Default for Opcode {
30  fn default() -> Self { Opcode::DeviceList }
31}
32
33#[derive(Debug, PartialEq, Serialize)]
34#[serde(rename_all = "UPPERCASE")]
35pub enum Space {
36  Snes,
37  Cmd,
38}
39
40impl Default for Space {
41  fn default() -> Self { Space::Snes }
42}
43
44#[derive(Debug, Default, PartialEq, Serialize)]
45#[serde(rename_all = "PascalCase")]
46pub struct Request {
47  opcode: Opcode,
48  space: Space,
49  #[serde(skip_serializing_if = "Option::is_none")]
50  flags: Option<Vec<String>>,
51  #[serde(skip_serializing_if = "Option::is_none")]
52  operands: Option<Vec<String>>,
53}
54
55impl Request {
56  #[must_use]
57  pub fn device_list() -> Self {
58    Request {
59      opcode: Opcode::DeviceList,
60      space: Space::Snes,
61      ..Self::default()
62    }
63  }
64
65  #[must_use]
66  pub fn attach(device: &str) -> Self {
67    Request {
68      opcode: Opcode::Attach,
69      space: Space::Snes,
70      operands: Some(vec![device.into()]),
71      ..Self::default()
72    }
73  }
74
75  #[must_use]
76  pub fn info() -> Self {
77    Request {
78      opcode: Opcode::Info,
79      space: Space::Snes,
80      ..Self::default()
81    }
82  }
83
84  #[must_use]
85  pub fn get_address(offset: usize, length: usize) -> Self {
86    Request {
87      opcode: Opcode::GetAddress,
88      space: Space::Snes,
89      operands: Some(vec![
90        format!("{:X}", offset),
91        format!("{:X}", length),
92      ]),
93      ..Self::default()
94    }
95  }
96}