use http::Uri;
use snafu::ResultExt;
use crate::error::HttpSnafu;
use crate::models::memberships::{Role, TeamMembership};
use crate::{Octocrab, Result};
#[derive(Debug, serde::Serialize)]
struct RoleUpdateBody {
role: Role,
}
pub struct TeamMembershipBuilder<'octo> {
crab: &'octo Octocrab,
org: String,
team: String,
}
impl<'octo> TeamMembershipBuilder<'octo> {
pub(crate) fn new(crab: &'octo Octocrab, org: String, team: String) -> Self {
Self { crab, org, team }
}
pub async fn get(&self, username: impl Into<String>) -> Result<TeamMembership> {
let route = format!(
"/orgs/{org}/teams/{team}/memberships/{username}",
org = self.org,
team = self.team,
username = username.into(),
);
self.crab.get(route, None::<&()>).await
}
pub async fn add_or_update(
&self,
username: impl Into<String>,
role: impl Into<Option<Role>>,
) -> Result<TeamMembership> {
let route = format!(
"/orgs/{org}/teams/{team}/memberships/{username}",
org = self.org,
team = self.team,
username = username.into(),
);
let role_body = role.into().map(|role| RoleUpdateBody { role });
self.crab.put(route, role_body.as_ref()).await
}
pub async fn remove(&self, username: impl Into<String>) -> Result<()> {
let route = format!(
"/orgs/{org}/teams/{team}/memberships/{username}",
org = self.org,
team = self.team,
username = username.into(),
);
let uri = Uri::builder()
.path_and_query(route)
.build()
.context(HttpSnafu)?;
crate::map_github_error(self.crab._delete(uri, None::<&()>).await?)
.await
.map(drop)
}
}