use crate::serde_helpers::double_option;
use super::*;
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubBase {
pub id: String,
pub r#type: HubType,
}
#[derive(Clone, Debug, PartialEq)]
pub enum HubAccessGrantee {
User(HubCollaborationUser),
Group(GroupMini),
Unknown(serde_json::Value),
}
impl Default for HubAccessGrantee {
fn default() -> Self {
Self::Unknown(Default::default())
}
}
impl serde::Serialize for HubAccessGrantee {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::User(inner) => inner.serialize(serializer),
Self::Group(inner) => inner.serialize(serializer),
Self::Unknown(inner) => inner.serialize(serializer),
}
}
}
impl<'de> serde::Deserialize<'de> for HubAccessGrantee {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let value = serde_json::Value::deserialize(deserializer)?;
let tag = value
.get("type")
.and_then(serde_json::Value::as_str)
.map(str::to_owned);
match tag.as_deref() {
Some("user") => Ok(Self::User(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("group") => Ok(Self::Group(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
_ => Ok(Self::Unknown(value)),
}
}
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubCollaboration {
pub id: String,
pub r#type: HubCollaborationType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hub: Option<HubBase>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accessible_by: Option<HubAccessGrantee>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<HubCollaborationStatus>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub acceptance_requirements_status: Option<HubCollaborationAcceptanceRequirementsStatus>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubCollaborationCreateRequest {
pub hub: HubCollaborationCreateRequestHub,
pub accessible_by: HubCollaborationCreateRequestAccessibleBy,
pub role: String,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubCollaborations {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<HubCollaboration>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limit: Option<i64>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "double_option"
)]
pub next_marker: Option<Option<String>>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubCollaborationUpdateRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubCollaborationUser {
pub id: String,
pub r#type: HubCollaborationUserType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub login: Option<String>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct HubCollaborationType(pub String);
impl HubCollaborationType {
pub const HUB_COLLABORATION: &'static str = "hub_collaboration";
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct HubCollaborationStatus(pub String);
impl HubCollaborationStatus {
pub const ACCEPTED: &'static str = "accepted";
pub const PENDING: &'static str = "pending";
pub const REJECTED: &'static str = "rejected";
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubCollaborationAcceptanceRequirementsStatus {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub terms_of_service_requirement: Option<AcceptanceRequirementsStatusTermsOfServiceRequirement>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub strong_password_requirement: Option<AcceptanceRequirementsStatusStrongPasswordRequirement>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub two_factor_authentication_requirement:
Option<AcceptanceRequirementsStatusTwoFactorAuthenticationRequirement>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubCollaborationCreateRequestHub {
pub r#type: HubType,
pub id: String,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubCollaborationCreateRequestAccessibleBy {
pub r#type: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub login: Option<String>,
}