analyticord 0.1.2

Simple wrapper around the Analyticord API.
Documentation
extern crate reqwest;

use hyper::header::Authorization;
use hyper::StatusCode;
use super::data::SubmitData;
use super::error::{AnalyticordError, Result};
use super::events::Event;

/// The client struct used to interact with Analyticord.
#[derive(Debug)]
pub struct Client {
    url: String,
    token: String,
    client: reqwest::Client,
}

impl Client {
    /**
        Creates a new Client using the default URL. If the bot is invalid it will return an
        AnalyticordError.
        # Arguments

        * `token` - Your Analyticord bot token

        # Example

        ```
        use analyticord::client::Client;
        let _client = Client::default("YOUR_TOKEN_HERE".into());
        ```
    */
    pub fn default(token: String) -> Result<Client> {
        Client::with_url("https://analyticord.solutions".into(), token)
    }

    /// Creates a new Client, giving you the option to also define the URL. Everything else is the
    ///same compared to `default`.
    pub fn with_url(url: String, token: String) -> Result<Client> {
        let the_client = Client {
            url: url,
            token: token,
            client: reqwest::Client::new().unwrap(),
        };
        let mut res = the_client
            .client
            .get(format!("{}{}", the_client.url, "/api/botLogin").as_str())
            .unwrap()
            .header(Authorization(format!("bot {}", the_client.token)))
            .send()
            .unwrap();
        match res.status() {
            StatusCode::Ok => Ok(the_client),
            StatusCode::ImATeapot => Err(res.json().unwrap()),
            _ => Err(AnalyticordError::Unknown),
        }
    }

    /**
        Submits an Event to the Analyticord API and returns a Result<SubmitData>.

        # Arguments

        * `event` - The Event you want to submit

        # Example

        ```
        use analyticord::client::Client;
        use analyticord::events::Messages;

        let client = Client::default("YOUR_TOKEN".into());
        if client.is_err() {
            print!("{}", "borked token, try again.");
            std::process::exit(0);
        }
        let res = client.unwrap().send_event(Messages { amount: 10 });
        match res {
            Ok(data)    => print!("Successfully submitted. ID: {}", data.id),
            Err(error)  => print!("Error: {:?}", error),
        }
        ```
    */
    pub fn send_event<T: Event>(self, event: T) -> Result<SubmitData> {
        let event_data = event.get_event_data();
        let mut res = self.client
            .post(format!("{}{}", self.url, "/api/submit").as_str())
            .unwrap()
            .header(Authorization(format!("bot {}", self.token)))
            .form(&[("eventType", event_data.0), ("data", event_data.1)])
            .unwrap()
            .send()
            .unwrap();
        match res.status() {
            StatusCode::ImATeapot => Err(res.json().unwrap()),
            StatusCode::Ok => Ok(res.json().unwrap()),
            _ => Err(AnalyticordError::Unknown),
        }
    }
}