use std::fmt::{Display, Formatter};
use serde::{Deserialize, Serialize};
use url::Url;
use crate::id;
use crate::resource::{Login, NodeId};
id!(
OrganizationId
);
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Deserialize, Serialize)]
pub struct Organization {
login: Login,
id: OrganizationId,
node_id: NodeId,
url: Url,
repos_url: Url,
events_url: Url,
hooks_url: Url,
issues_url: Url,
members_url: Url,
public_members_url: Url,
avatar_url: Url,
description: String,
}
impl Organization {
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn login(&self) -> &Login {
&self.login
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn id(&self) -> OrganizationId {
self.id
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn node_id(&self) -> &NodeId {
&self.node_id
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn url(&self) -> &Url {
&self.url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn repos_url(&self) -> &Url {
&self.repos_url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn events_url(&self) -> &Url {
&self.events_url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn hooks_url(&self) -> &Url {
&self.hooks_url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn issues_url(&self) -> &Url {
&self.issues_url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn members_url(&self) -> &Url {
&self.members_url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn public_members_url(&self) -> &Url {
&self.public_members_url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn avatar_url(&self) -> &Url {
&self.avatar_url
}
#[cfg_attr(feature = "tracing", tracing::instrument)]
pub fn description(&self) -> &str {
&self.description
}
}
impl Display for Organization {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.login)
}
}
#[cfg(test)]
mod tests {
use super::Organization;
#[test]
fn trait_deserialize() {
let organization: Organization = serde_json::from_str(include_str!(
"../../tests/fixtures/resource/organization.json"
))
.unwrap();
assert_eq!("devxbots", organization.login().get());
}
#[test]
fn trait_display() {
let organization: Organization = serde_json::from_str(include_str!(
"../../tests/fixtures/resource/organization.json"
))
.unwrap();
assert_eq!("devxbots", organization.to_string());
}
#[test]
fn trait_send() {
fn assert_send<T: Send>() {}
assert_send::<Organization>();
}
#[test]
fn trait_sync() {
fn assert_sync<T: Sync>() {}
assert_sync::<Organization>();
}
}