blynk_io 0.3.0

Blynk.io streaming API integration in Rust
Documentation
use log::*;

#[derive(Debug)]
pub struct Config {
    pub token: String,
    pub server: String,
    pub port: u64,
}

impl Default for Config {
    fn default() -> Self {
        Self {
            token: "".to_string(),
            server: "blynk-cloud.com".to_string(),
            port: 80,
        }
    }
}

impl Config {
    pub fn new<T>(mut args: T) -> Result<Self, &'static str>
    where
        T: Iterator<Item = String>,
    {
        args.next();

        let token = match args.next() {
            Some(arg) => arg,
            None => return Err("Token not provided"),
        };

        let server = match args.next() {
            Some(arg) => arg,
            None => {
                let server = "blynk-cloud.com";
                info!("No server name provided, using default ({})", server);
                server.into()
            }
        };

        let port = match args.next() {
            Some(arg) => arg.parse::<u64>().unwrap(),
            None => {
                let port = 80u64;
                info!("No server name provided, using default ({})", port);
                port
            }
        };

        Ok(Config {
            token,
            server,
            port,
        })
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn token_required() {
        let args = ["progname"].iter().map(|s| s.to_string());
        let result = Config::new(args).unwrap_err();
        assert_eq!("Token not provided", result);
    }

    #[test]
    fn server_and_port_parsed() {
        let server = "example.com";
        let port = "1234";
        let vec = vec!["pogname", "token", server, port];
        let args = vec.iter().map(|s| s.to_string());
        let conf = Config::new(args).unwrap();
        assert_eq!(server, conf.server);
        assert_eq!(port.parse::<u64>().unwrap(), conf.port);
    }

    #[test]
    fn server_and_port_default() {
        let args = ["progname", "token"].iter().map(|s| s.to_string());
        let conf = Config::new(args).unwrap();
        assert_eq!("token", conf.token);
        assert_eq!("blynk-cloud.com", conf.server);
        assert_eq!(80, conf.port);
    }
}