diff --git a/twilight-http/src/client/mod.rs b/twilight-http/src/client/mod.rs index 4090b0c003..43a0a133dc 100644 --- a/twilight-http/src/client/mod.rs +++ b/twilight-http/src/client/mod.rs @@ -57,7 +57,9 @@ use crate::{ AddGuildMember, AddRoleToMember, GetGuildMembers, GetMember, RemoveMember, RemoveRoleFromMember, SearchGuildMembers, UpdateGuildMember, }, - role::{CreateRole, DeleteRole, GetGuildRoles, UpdateRole, UpdateRolePositions}, + role::{ + CreateRole, DeleteRole, GetGuildRoles, GetRole, UpdateRole, UpdateRolePositions, + }, sticker::{ CreateGuildSticker, DeleteGuildSticker, GetGuildSticker, GetGuildStickers, UpdateGuildSticker, @@ -1669,6 +1671,11 @@ impl Client { GetGuildRoles::new(self, guild_id) } + /// Get a role of a guild. + pub const fn role(&self, guild_id: Id, role_id: Id) -> GetRole<'_> { + GetRole::new(self, guild_id, role_id) + } + /// Create a role in a guild. /// /// # Examples diff --git a/twilight-http/src/request/guild/role/get_role.rs b/twilight-http/src/request/guild/role/get_role.rs new file mode 100644 index 0000000000..f6d3b63de5 --- /dev/null +++ b/twilight-http/src/request/guild/role/get_role.rs @@ -0,0 +1,61 @@ +use crate::{ + client::Client, + error::Error, + request::{Request, TryIntoRequest}, + response::{Response, ResponseFuture}, + routing::Route, +}; +use std::future::IntoFuture; +use twilight_model::{ + guild::Role, + id::{ + marker::{GuildMarker, RoleMarker}, + Id, + }, +}; + +/// Get a role of a guild. +#[must_use = "requests must be configured and executed"] +pub struct GetRole<'a> { + guild_id: Id, + role_id: Id, + http: &'a Client, +} + +impl<'a> GetRole<'a> { + pub(crate) const fn new( + http: &'a Client, + guild_id: Id, + role_id: Id, + ) -> Self { + Self { + guild_id, + role_id, + http, + } + } +} + +impl IntoFuture for GetRole<'_> { + type Output = Result, Error>; + + type IntoFuture = ResponseFuture; + + fn into_future(self) -> Self::IntoFuture { + let http = self.http; + + match self.try_into_request() { + Ok(request) => http.request(request), + Err(source) => ResponseFuture::error(source), + } + } +} + +impl TryIntoRequest for GetRole<'_> { + fn try_into_request(self) -> Result { + Ok(Request::from_route(&Route::GetRole { + guild_id: self.guild_id.get(), + role_id: self.role_id.get(), + })) + } +} diff --git a/twilight-http/src/request/guild/role/mod.rs b/twilight-http/src/request/guild/role/mod.rs index c5173c0ce3..7eaff67aa4 100644 --- a/twilight-http/src/request/guild/role/mod.rs +++ b/twilight-http/src/request/guild/role/mod.rs @@ -1,10 +1,11 @@ mod create_role; mod delete_role; mod get_guild_roles; +mod get_role; mod update_role; mod update_role_positions; pub use self::{ create_role::CreateRole, delete_role::DeleteRole, get_guild_roles::GetGuildRoles, - update_role::UpdateRole, update_role_positions::UpdateRolePositions, + get_role::GetRole, update_role::UpdateRole, update_role_positions::UpdateRolePositions, }; diff --git a/twilight-http/src/request/try_into_request.rs b/twilight-http/src/request/try_into_request.rs index 64ed9579da..ce6a12d486 100644 --- a/twilight-http/src/request/try_into_request.rs +++ b/twilight-http/src/request/try_into_request.rs @@ -66,7 +66,9 @@ mod private { AddGuildMember, AddRoleToMember, GetGuildMembers, GetMember, RemoveMember, RemoveRoleFromMember, SearchGuildMembers, UpdateGuildMember, }, - role::{CreateRole, DeleteRole, GetGuildRoles, UpdateRole, UpdateRolePositions}, + role::{ + CreateRole, DeleteRole, GetGuildRoles, GetRole, UpdateRole, UpdateRolePositions, + }, sticker::{ CreateGuildSticker, DeleteGuildSticker, GetGuildSticker, GetGuildStickers, UpdateGuildSticker, @@ -236,6 +238,7 @@ mod private { impl Sealed for GetPublicArchivedThreads<'_> {} impl Sealed for GetReactions<'_> {} impl Sealed for GetResponse<'_> {} + impl Sealed for GetRole<'_> {} impl Sealed for GetSKUs<'_> {} impl Sealed for GetStageInstance<'_> {} impl Sealed for GetSticker<'_> {} diff --git a/twilight-http/src/routing.rs b/twilight-http/src/routing.rs index 0f3b3c2ba2..0f19e4e29d 100644 --- a/twilight-http/src/routing.rs +++ b/twilight-http/src/routing.rs @@ -642,7 +642,7 @@ pub enum Route<'a> { /// pruned. include_roles: &'a [Id], }, - /// Route information to get a guild's roles. + /// Route information to get guild's roles. GetGuildRoles { /// The ID of the guild. guild_id: u64, @@ -830,6 +830,13 @@ pub enum Route<'a> { /// The type of reactions to fetch. kind: Option, }, + /// Route information to get a guild's role. + GetRole { + /// The ID of the guild. + guild_id: u64, + /// The ID of the role. + role_id: u64, + }, GetSKUs { /// The ID of the application. application_id: u64, @@ -1301,6 +1308,7 @@ impl Route<'_> { | Self::GetPrivateArchivedThreads { .. } | Self::GetPublicArchivedThreads { .. } | Self::GetReactionUsers { .. } + | Self::GetRole { .. } | Self::GetSKUs { .. } | Self::GetStageInstance { .. } | Self::GetSticker { .. } @@ -1574,6 +1582,7 @@ impl Route<'_> { Path::ChannelsIdPermissionsOverwriteId(channel_id) } Self::DeleteRole { guild_id, .. } + | Self::GetRole { guild_id, .. } | Self::UpdateRole { guild_id, .. } | Self::UpdateRolePositions { guild_id } => Path::GuildsIdRolesId(guild_id), Self::DeleteTemplate { @@ -2307,7 +2316,9 @@ impl Display for Route<'_> { Display::fmt(user_id, f) } - Route::DeleteRole { guild_id, role_id } | Route::UpdateRole { guild_id, role_id } => { + Route::DeleteRole { guild_id, role_id } + | Route::GetRole { guild_id, role_id } + | Route::UpdateRole { guild_id, role_id } => { f.write_str("guilds/")?; Display::fmt(guild_id, f)?; f.write_str("/roles/")?;