manager 0.1.0

Artifice Management crate
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> {
        // raed from env var to get strings of receiver, and sender
        let recv = var("recveiver")?;
        let send = var("sender")?;
        let receiver = serde_json::from_str(&recv).unwrap();
        let sender = serde_json::from_str(&send).unwrap();
        //sender.send();

        Ok(Self { sender, receiver })
    }
}