use crate::serde_helpers::double_option;
use super::*;
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubItem {
pub id: String,
pub r#type: HubItemType,
pub name: String,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubItemOperation {
pub action: HubItemOperationAction,
pub item: HubItemReference,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_id: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubItemOperationResult {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub action: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub item: Option<HubItemReference>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub status: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum HubItemReference {
File(FileReference),
Folder(FolderReference),
WebLink(WeblinkReference),
Unknown(serde_json::Value),
}
impl Default for HubItemReference {
fn default() -> Self {
Self::Unknown(Default::default())
}
}
impl serde::Serialize for HubItemReference {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self {
Self::File(inner) => inner.serialize(serializer),
Self::Folder(inner) => inner.serialize(serializer),
Self::WebLink(inner) => inner.serialize(serializer),
Self::Unknown(inner) => inner.serialize(serializer),
}
}
}
impl<'de> serde::Deserialize<'de> for HubItemReference {
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("file") => Ok(Self::File(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("folder") => Ok(Self::Folder(
serde_json::from_value(value).map_err(serde::de::Error::custom)?,
)),
Some("web_link") => Ok(Self::WebLink(
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 HubItems {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub entries: Option<Vec<HubItem>>,
#[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 HubItemsManageRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub operations: Option<Vec<HubItemOperation>>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct HubItemsManageResponse {
pub operations: Vec<HubItemOperationResult>,
}
#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct WeblinkReference {
pub r#type: WeblinkReferenceType,
pub id: String,
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct HubItemType(pub String);
impl HubItemType {
pub const FILE: &'static str = "file";
pub const FOLDER: &'static str = "folder";
pub const WEB_LINK: &'static str = "web_link";
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct HubItemOperationAction(pub String);
impl HubItemOperationAction {
pub const ADD: &'static str = "add";
pub const REMOVE: &'static str = "remove";
}
#[derive(Clone, Debug, Default, Eq, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(transparent)]
pub struct WeblinkReferenceType(pub String);
impl WeblinkReferenceType {
pub const WEB_LINK: &'static str = "web_link";
}