qusb2snes-client 0.3.1

Client for Qusb2snes websocket interface
Documentation
use serde::Serialize;

#[derive(Debug, PartialEq, Serialize)]
#[serde(rename_all = "PascalCase")]
pub enum Opcode {
  DeviceList,
  Attach,
  AppVersion,
  Name,
  Close,
  Info,
  Boot,
  Menu,
  Reset,
  Binary,
  Stream,
  Fence,
  GetAddress,
  PutAddress,
  PutIPS,
  GetFile,
  PutFile,
  List,
  Remove,
  Rename,
  MakeDir,
}

impl Default for Opcode {
  fn default() -> Self { Opcode::DeviceList }
}

#[derive(Debug, PartialEq, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum Space {
  Snes,
  Cmd,
}

impl Default for Space {
  fn default() -> Self { Space::Snes }
}

#[derive(Debug, Default, PartialEq, Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct Request {
  opcode: Opcode,
  space: Space,
  #[serde(skip_serializing_if = "Option::is_none")]
  flags: Option<Vec<String>>,
  #[serde(skip_serializing_if = "Option::is_none")]
  operands: Option<Vec<String>>,
}

impl Request {
  #[must_use]
  pub fn device_list() -> Self {
    Request {
      opcode: Opcode::DeviceList,
      space: Space::Snes,
      ..Self::default()
    }
  }

  #[must_use]
  pub fn attach(device: &str) -> Self {
    Request {
      opcode: Opcode::Attach,
      space: Space::Snes,
      operands: Some(vec![device.into()]),
      ..Self::default()
    }
  }

  #[must_use]
  pub fn info() -> Self {
    Request {
      opcode: Opcode::Info,
      space: Space::Snes,
      ..Self::default()
    }
  }

  #[must_use]
  pub fn get_address(offset: usize, length: usize) -> Self {
    Request {
      opcode: Opcode::GetAddress,
      space: Space::Snes,
      operands: Some(vec![
        format!("{:X}", offset),
        format!("{:X}", length),
      ]),
      ..Self::default()
    }
  }
}