fleet 0.2.0

A client library for CoreOS's fleet.
use rustc_serialize::json::{Json, ToJson};

pub enum UnitStates {
    Inactive,
    Loaded,
    Launched,
}

impl UnitStates {
    pub fn from_str(s: &str) -> UnitStates {
        match s {
            "inactive" => UnitStates::Inactive,
            "loaded" => UnitStates::Loaded,
            "launched" => UnitStates::Launched,
            variant => panic!("not a valid UnitStates variant: {}", variant),
        }
    }
}

impl ToJson for UnitStates {
    fn to_json(&self) -> Json {
        let value = match *self {
            UnitStates::Inactive => "inactive",
            UnitStates::Loaded => "loaded",
            UnitStates::Launched => "launched",
        };

        Json::String(value.to_string())
    }
}

#[derive(RustcEncodable)]
pub struct UnitOption {
    pub name: String,
    pub section: String,
    pub value: String,
}

pub struct Unit {
    pub current_state: UnitStates,
    pub desired_state: UnitStates,
    pub machine_id: Option<String>,
    pub name: String,
    pub options: Vec<UnitOption>,
}

pub struct UnitPage {
    units: Vec<Unit>,
    next_page_token: Option<String>,
}

pub struct UnitState {
    pub name: String,
    pub hash: String,
    pub machine_id: Option<String>,
    pub systemd_load_state: String,
    pub systemd_active_state: String,
    pub systemd_sub_state: String,
}

pub struct UnitStatePage {
    states: Vec<UnitState>,
    next_page_token: Option<String>,
}

#[cfg(test)]
mod unit_tests {
    use super::{Unit, UnitStates, UnitOption};

    #[test]
    fn it_can_be_constructed() {
        let unit_option = UnitOption {
            name: "Description".to_string(),
            section: "Unit".to_string(),
            value: "Example unit".to_string(),
        };

        Unit {
            current_state: UnitStates::Inactive,
            desired_state: UnitStates::Launched,
            machine_id: Some("abc123".to_string()),
            name: "example.service".to_string(),
            options: vec![unit_option],
        };
    }
}

#[cfg(test)]
mod unit_page_tests {
    use super::{Unit, UnitPage, UnitStates};

    #[test]
    fn it_can_be_paginated() {
        let unit = Unit {
            current_state: UnitStates::Inactive,
            desired_state: UnitStates::Launched,
            machine_id: Some("abc123".to_string()),
            name: "example.service".to_string(),
            options: vec![],
        };

        UnitPage {
            units: vec![unit],
            next_page_token: Some("8fefec2c".to_string()),
        };
    }

    #[test]
    fn it_can_have_no_additional_pages() {
        let unit = Unit {
            current_state: UnitStates::Inactive,
            desired_state: UnitStates::Launched,
            machine_id: Some("abc123".to_string()),
            name: "example.service".to_string(),
            options: vec![],
        };

        UnitPage {
            units: vec![unit],
            next_page_token: None,
        };
    }
}

#[cfg(test)]
mod unit_state_tests {
    use super::UnitState;

    #[test]
    fn it_can_be_constructed() {
        UnitState {
            name: "example.service".to_string(),
            hash: "abc123".to_string(),
            machine_id: Some("123abc".to_string()),
            systemd_load_state: "loaded".to_string(),
            systemd_active_state: "active".to_string(),
            systemd_sub_state: "running".to_string(),
        };
    }
}

#[cfg(test)]
mod unit_state_page_tests {
    use super::{UnitState, UnitStatePage};

    fn it_can_be_paginated() {
        let unit_state = UnitState {
            name: "example.service".to_string(),
            hash: "abc123".to_string(),
            machine_id: Some("123abc".to_string()),
            systemd_load_state: "loaded".to_string(),
            systemd_active_state: "active".to_string(),
            systemd_sub_state: "running".to_string(),
        };

        UnitStatePage {
            states: vec![unit_state],
            next_page_token: Some("8fefec2c".to_string()),
        };
    }

    fn it_can_have_no_additional_pages() {
        let unit_state = UnitState {
            name: "example.service".to_string(),
            hash: "abc123".to_string(),
            machine_id: Some("123abc".to_string()),
            systemd_load_state: "loaded".to_string(),
            systemd_active_state: "active".to_string(),
            systemd_sub_state: "running".to_string(),
        };

        UnitStatePage {
            states: vec![unit_state],
            next_page_token: None,
        };
    }
}