use std::collections::BTreeMap;
use std::fmt;
use serde::{Deserialize, Serialize};
use super::assignment::{Assignment, AssignmentSigner};
use super::tag::Tag;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Document {
#[serde(default)]
pub resource: Option<String>,
pub id: String,
#[serde(default)]
pub account_id: Option<String>,
#[serde(default)]
pub template_id: Option<String>,
pub name: String,
pub status: DocumentStatus,
#[serde(default)]
pub artifacts: BTreeMap<String, String>,
#[serde(default)]
pub pages: Vec<DocumentPage>,
#[serde(default)]
pub assignment: Option<Assignment>,
#[serde(default)]
pub current_signer: Option<AssignmentSigner>,
#[serde(default)]
pub is_closed: bool,
#[serde(default)]
pub signing_url: Option<String>,
#[serde(default)]
pub decline_reason: Option<String>,
#[serde(default)]
pub declined_by: Option<DeclinedBy>,
#[serde(default)]
pub tags: Vec<Tag>,
#[serde(default)]
pub created_at: Option<serde_json::Value>,
#[serde(default)]
pub updated_at: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DocumentPage {
pub id: String,
pub number: u32,
pub height: u32,
pub width: u32,
#[serde(default)]
pub download_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DeclinedBy {
pub id: String,
#[serde(default)]
pub full_name: Option<String>,
#[serde(default)]
pub email: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Artifact {
pub name: String,
pub url: String,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ArtifactName {
Original,
Certificated,
CertificatePage,
Bundle,
Thumbnail,
Other(String),
}
impl ArtifactName {
pub fn as_str(&self) -> &str {
match self {
ArtifactName::Original => "original",
ArtifactName::Certificated => "certificated",
ArtifactName::CertificatePage => "certificate-page",
ArtifactName::Bundle => "bundle",
ArtifactName::Thumbnail => "thumbnail",
ArtifactName::Other(s) => s.as_str(),
}
}
}
impl fmt::Display for ArtifactName {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
impl From<&str> for ArtifactName {
fn from(s: &str) -> Self {
match s {
"original" => ArtifactName::Original,
"certificated" => ArtifactName::Certificated,
"certificate-page" => ArtifactName::CertificatePage,
"bundle" => ArtifactName::Bundle,
"thumbnail" => ArtifactName::Thumbnail,
other => ArtifactName::Other(other.to_owned()),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DocumentStatus {
Uploading,
Uploaded,
MetadataProcessing,
MetadataReady,
Expired,
Certificating,
Certificated,
RejectedBySigner,
PendingSignature,
RejectedByUser,
Failed,
#[serde(untagged)]
Unknown(String),
}
impl DocumentStatus {
pub fn as_str(&self) -> &str {
match self {
DocumentStatus::Uploading => "uploading",
DocumentStatus::Uploaded => "uploaded",
DocumentStatus::MetadataProcessing => "metadata_processing",
DocumentStatus::MetadataReady => "metadata_ready",
DocumentStatus::Expired => "expired",
DocumentStatus::Certificating => "certificating",
DocumentStatus::Certificated => "certificated",
DocumentStatus::RejectedBySigner => "rejected_by_signer",
DocumentStatus::PendingSignature => "pending_signature",
DocumentStatus::RejectedByUser => "rejected_by_user",
DocumentStatus::Failed => "failed",
DocumentStatus::Unknown(s) => s.as_str(),
}
}
}
impl fmt::Display for DocumentStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DocumentStatusInfo {
pub code: DocumentStatus,
pub deletable: bool,
}