use crate::permissions::Permission;
use ipc_channel::ipc::{IpcReceiver, IpcSender};
use std::env::{var, VarError};
#[no_mangle]
pub extern "C" fn random_func(){
println!("hello world");
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RequestType {
Data,
Authentication,
Permission(Permission),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct APIHeader {
program: String,
api_key: String,
action: RequestType,
}
impl APIHeader {
pub fn new(program: &str, api_key: &str, action: RequestType) -> Self {
Self {
program: program.to_string(),
api_key: api_key.to_string(),
action,
}
}
pub fn set_request_type(&mut self, action: RequestType) {
self.action = action;
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct APIPacket {
header: APIHeader,
data: Vec<u8>,
}
impl APIPacket {
pub fn new(header: APIHeader, content: &[u8]) -> Self {
let mut data = Vec::new();
data.extend_from_slice(&content);
Self { header, data }
}
pub fn update_data(&mut self, data: &[u8]) {
self.data.clear();
self.data.extend_from_slice(&data);
}
pub fn to_raw(&self) -> Vec<u8> {
let header_bytes = serde_json::to_string(&self.header).unwrap().into_bytes();
let header_size = header_bytes.len() as u16;
let mut outbuf = Vec::new();
let bytes: [u8; 2] = header_size.to_be_bytes();
outbuf.push(bytes[0]);
outbuf.push(bytes[1]);
outbuf.extend_from_slice(&header_bytes.as_slice());
outbuf.extend_from_slice(&self.data.as_slice());
outbuf
}
pub fn from_raw(content: &[u8]) -> Self {
let size: u16 = u16::from_be_bytes([content[0], content[1]]);
let header_str = String::from_utf8(content[0..(size as usize)].to_vec()).unwrap();
let header = serde_json::from_str(&header_str).unwrap();
let mut data = Vec::new();
data.extend_from_slice(&content[(size as usize)..content.len()]);
Self { header, data }
}
}
#[test]
pub fn bitshift() {
let orig: u16 = 5324;
let mut temp: [u8; 2] = [0; 2];
temp[0] = orig as u8;
temp[1] = (orig as u8) << 8;
let new: u16 = (temp[0] as u16) | (temp[1] as u16);
assert_eq!(orig, new);
}
#[derive(Debug, Serialize, Deserialize)]
pub struct APIStream {
receiver: IpcReceiver<APIPacket>,
sender: IpcSender<APIPacket>,
}
impl APIStream {
pub fn authenticate(program: &str, _api_key: &str) -> Result<Self, VarError> {
let recv = var("recveiver")?;
let send = var("sender")?;
let receiver = serde_json::from_str(&recv).unwrap();
let sender = serde_json::from_str(&send).unwrap();
Ok(Self { sender, receiver })
}
}