use hyper::{Error as HyperError, Url};
use activity::common::Subscription;
use client::Client;
use common::{Repository, User};
use error;
use utils;
pub trait WatchingExt {
fn get_repos_owner_repo_subscribers(&mut self, owner: String, repo: String) -> Result<User, error::Error>;
fn get_users_username_subscription(&mut self, username: String) -> Result<Repository, error::Error>;
fn get_user_subscription(&mut self) -> Result<Repository, error::Error>;
fn get_repos_owner_repo_subscription(&mut self, owner: String, repo: String) -> Result<Subscription, error::Error>;
fn put_repos_owner_repo_subscription(&mut self, owner: String, repo: String, subscribed: bool, ignored: bool) -> Result<Subscription, error::Error>;
fn delete_repos_owner_subscription(&mut self, owner: String, repo: String) -> Result<(), error::Error>;
}
impl WatchingExt for Client {
fn get_repos_owner_repo_subscribers(&mut self, owner: String, repo: String) -> Result<User, error::Error> {
utils::request_endpoint(self, format!("/repos/{}/{}/subscribers", owner, repo))
}
fn get_users_username_subscription(&mut self, username: String) -> Result<Repository, error::Error> {
utils::request_endpoint(self, format!("/users/{}/subscriptions", username))
}
fn get_user_subscription(&mut self) -> Result<Repository, error::Error> {
utils::request_endpoint(self, "/user/subscriptions".into())
}
fn get_repos_owner_repo_subscription(&mut self, owner: String, repo: String) -> Result<Subscription, error::Error> {
utils::request_endpoint(self, format!("/repos/{}/{}/subscription", owner, repo))
}
fn put_repos_owner_repo_subscription(&mut self, owner: String, repo: String, subscribed: bool, ignored: bool) -> Result<Subscription, error::Error> {
let mut url = match Url::parse(&format!("{}/repos/{}/{}/subscription", self.api_url, owner, repo)[..]) {
Ok(url) => url,
Err(err) => return Err(error::Error::HTTP(HyperError::Uri(err)))
};
{
let mut query_pairs = url.query_pairs_mut();
query_pairs.clear();
query_pairs.append_pair("subscribed", &format!("{}", subscribed)[..]);
query_pairs.append_pair("ignored", &format!("{}", ignored)[..]);
}
utils::request_endpoint(self, format!("/repos/{}/{}/subscription?{}", owner, repo, url.query().unwrap()))
}
fn delete_repos_owner_subscription(&mut self, owner: String, repo: String) -> Result<(), error::Error> {
match self.delete(format!("/repos/{}/{}/subscription", owner, repo), None) {
Ok(_) => Ok(()),
Err(err) => Err(err)
}
}
}