bugsnag 0.2.1

The api of Bugsnag in rust.
Documentation
use sys_info;

#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct DeviceInfo {
    os_version: String,
    hostname: String,
}

impl DeviceInfo {
    pub fn new(version: &str, name: &str) -> DeviceInfo {
        DeviceInfo {
            os_version: version.to_owned(),
            hostname: name.to_owned(),
        }
    }

    pub fn generate() -> DeviceInfo {
        let mut version = sys_info::os_type().unwrap_or("Unknown".to_owned());
        version.push_str(":");
        version.push_str(&sys_info::os_release().unwrap_or("u.k.n.o.w.n".to_owned()));

        let hostname = sys_info::hostname().unwrap_or("UnknownHost".to_owned());

        DeviceInfo::new(version.as_str(), hostname.as_str())
    }

    pub fn set_os_version(&mut self, version: &str) {
        self.os_version = version.to_owned();
    }

    pub fn set_hostname(&mut self, name: &str) {
        self.hostname = name.to_owned();
    }
}

#[cfg(test)]
mod tests {
    use super::DeviceInfo;
    use serde_test::{assert_ser_tokens, Token};

    #[test]
    fn test_deviceinfo_to_json() {
        let info = DeviceInfo::new("1.0.0", "testmachine");

        assert_ser_tokens(
            &info,
            &[
                Token::Struct {
                    name: "DeviceInfo",
                    len: 2,
                },
                Token::Str("osVersion"),
                Token::Str("1.0.0"),
                Token::Str("hostname"),
                Token::Str("testmachine"),
                Token::StructEnd,
            ],
        );
    }

    #[test]
    fn test_deviceinfo_to_json_with_set() {
        let mut info = DeviceInfo::generate();
        info.set_hostname("testmachine3");
        info.set_os_version("3.0.0");

        assert_ser_tokens(
            &info,
            &[
                Token::Struct {
                    name: "DeviceInfo",
                    len: 2,
                },
                Token::Str("osVersion"),
                Token::Str("3.0.0"),
                Token::Str("hostname"),
                Token::Str("testmachine3"),
                Token::StructEnd,
            ],
        );
    }
}