product-os-command-control 0.0.6

Product OS : Command and Control provides a set of tools for running command and control across a distributed set of Product OS : Servers.
Documentation


use headers::{ Header, HeaderName };

use serde::{ Deserialize, Serialize };
use lazy_static::lazy_static;


#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CommandControlAuthenticateError {
    pub error: CommandControlAuthenticateErrorState
}

#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum CommandControlAuthenticateErrorState {
    KeyError(String),
    None
}

impl std::error::Error for CommandControlAuthenticateError {}

impl std::fmt::Display for CommandControlAuthenticateError {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        match &self.error {
            CommandControlAuthenticateErrorState::KeyError(m) => write!(f, "{}", m),
            CommandControlAuthenticateErrorState::None => write!(f, "No error")
        }
    }
}

lazy_static! {
    static ref X_INTERACT_COMMAND: HeaderName = HeaderName::from_static("x-product-os-command");
    static ref X_INTERACT_CONTROL: HeaderName = HeaderName::from_static("x-product-os-control");
    static ref X_INTERACT_VERIFY: HeaderName = HeaderName::from_static("x-product-os-verify");
}

pub struct XProductOSCommandHeader(String);

impl XProductOSCommandHeader {
    pub fn value(self) -> String {
        self.0
    }
}

impl Header for XProductOSCommandHeader {
    fn name() -> &'static HeaderName {
        &X_INTERACT_COMMAND
    }

    fn decode<'i, I>(values: &mut I) -> Result<Self, headers::Error>
        where
            I: Iterator<Item = &'i headers::HeaderValue> {
        let value = values
            .next()
            .ok_or_else(headers::Error::invalid)?;

        Ok(XProductOSCommandHeader(value.to_str().unwrap().to_string()))
        // Err(headers::Error::invalid())
    }

    fn encode<E>(&self, values: &mut E)
        where
            E: Extend<headers::HeaderValue> {
        let value = headers::HeaderValue::from_str(self.0.as_str()).unwrap();
        values.extend(std::iter::once(value));
    }
}

pub struct XProductOSControlHeader(String);

impl XProductOSControlHeader {
    pub fn value(self) -> String {
        self.0
    }
}

impl Header for XProductOSControlHeader {
    fn name() -> &'static HeaderName {
        &X_INTERACT_CONTROL
    }

    fn decode<'i, I>(values: &mut I) -> Result<Self, headers::Error>
        where
            I: Iterator<Item = &'i headers::HeaderValue> {
        let value = values
            .next()
            .ok_or_else(headers::Error::invalid)?;

        Ok(XProductOSControlHeader(value.to_str().unwrap().to_string()))
        // Err(headers::Error::invalid())
    }

    fn encode<E>(&self, values: &mut E)
        where
            E: Extend<headers::HeaderValue> {
        let value = headers::HeaderValue::from_str(self.0.as_str()).unwrap();
        values.extend(std::iter::once(value));
    }
}

pub struct XProductOSVerifyHeader(String);

impl XProductOSVerifyHeader {
    pub fn value(self) -> String {
        self.0
    }
}

impl Header for XProductOSVerifyHeader {
    fn name() -> &'static HeaderName {
        &X_INTERACT_VERIFY
    }

    fn decode<'i, I>(values: &mut I) -> Result<Self, headers::Error>
        where
            I: Iterator<Item = &'i headers::HeaderValue> {
        let value = values
            .next()
            .ok_or_else(headers::Error::invalid)?;

        Ok(XProductOSVerifyHeader(value.to_str().unwrap().to_string()))
        // Err(headers::Error::invalid())
    }

    fn encode<E>(&self, values: &mut E)
        where
            E: Extend<headers::HeaderValue> {
        let value = headers::HeaderValue::from_str(self.0.as_str()).unwrap();
        values.extend(std::iter::once(value));
    }
}