use serde::{Deserialize, Serialize};
use url::Url;
use super::{MinimalRepository, SimpleUser};
pub use super::{PackageId, PackageVersionId};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Package {
pub id: PackageId,
pub name: String,
pub package_type: PackageType,
pub url: Url,
pub html_url: Url,
pub version_count: usize,
pub visibility: PackageVisibility,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner: Option<SimpleUser>,
#[serde(skip_serializing_if = "Option::is_none")]
pub repository: Option<MinimalRepository>,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct PackageVersion {
pub id: PackageVersionId,
pub name: String,
pub url: Url,
pub package_html_url: Url,
#[serde(skip_serializing_if = "Option::is_none")]
pub html_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub created_at: chrono::DateTime<chrono::Utc>,
pub updated_at: chrono::DateTime<chrono::Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_at: Option<chrono::DateTime<chrono::Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<PackageVersionMetadata>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct PackageVersionMetadata {
pub package_type: PackageType,
#[serde(skip_serializing_if = "Option::is_none")]
pub container: Option<ContainerMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub docker: Option<DockerMetadata>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ContainerMetadata {
#[serde(default)]
pub tags: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct DockerMetadata {
#[serde(default)]
pub tag: Vec<String>,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum PackageType {
Npm,
Maven,
Rubygems,
Docker,
Nuget,
Container,
}
impl std::fmt::Display for PackageType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PackageType::Npm => write!(f, "npm"),
PackageType::Maven => write!(f, "maven"),
PackageType::Rubygems => write!(f, "rubygems"),
PackageType::Docker => write!(f, "docker"),
PackageType::Nuget => write!(f, "nuget"),
PackageType::Container => write!(f, "container"),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum PackageVisibility {
Public,
Private,
Internal,
}
impl std::fmt::Display for PackageVisibility {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PackageVisibility::Public => write!(f, "public"),
PackageVisibility::Private => write!(f, "private"),
PackageVisibility::Internal => write!(f, "internal"),
}
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
#[non_exhaustive]
pub enum PackageVersionState {
Active,
Deleted,
}
impl std::fmt::Display for PackageVersionState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
PackageVersionState::Active => write!(f, "active"),
PackageVersionState::Deleted => write!(f, "deleted"),
}
}
}