use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
use url::Url;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ApiStatus {
Offline,
Test,
Maintenance,
Online,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ApiRecord {
pub provider_id: String,
pub api_id: String,
pub major_version: i32,
pub url: Url,
#[serde(skip_serializing_if = "Option::is_none")]
pub additional_metadata: Option<HashMap<String, String>>,
#[serde(with = "time::serde::rfc3339")]
pub last_updated: OffsetDateTime,
pub revision: i64,
pub status: ApiStatus,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ApiRecordRef {
pub provider_id: String,
pub api_id: String,
pub major_version: i32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SignedApiRecord {
pub content: ApiRecord,
pub signature: String,
pub signing_cert: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ContactInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ServiceInfo {
pub version: String,
pub contact: ContactInfo,
#[serde(with = "time::serde::rfc3339")]
pub last_updated: OffsetDateTime,
pub revision: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionRequest {
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub requested: Option<Vec<SubscriptionItem>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub canceled: Option<Vec<ApiRecordRef>>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SubscriptionItem {
pub record_ref: ApiRecordRef,
#[serde(skip_serializing_if = "Option::is_none")]
pub known_revision: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DirectoryNotification {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<String>,
#[serde(with = "time::serde::rfc3339")]
pub timestamp: OffsetDateTime,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_info: Option<ServiceInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub modified: Option<Vec<SignedApiRecord>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redirected: Option<Vec<RedirectInfo>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted: Option<Vec<ApiRecordRef>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub canceled: Option<Vec<CanceledSubscription>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<NotificationError>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RedirectInfo {
pub record_ref: ApiRecordRef,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<Url>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CanceledSubscription {
pub record_ref: ApiRecordRef,
pub canceled_by_client: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct NotificationError {
pub status_code: u32,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub request: Option<String>,
}