use serde::{Deserialize, Serialize};
use super::id::ArtifactId;
use super::{Metadata, Part};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Artifact {
pub artifact_id: ArtifactId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub parts: Vec<Part>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<String>,
}
impl Artifact {
pub fn new(artifact_id: impl Into<ArtifactId>, parts: Vec<Part>) -> Self {
Self {
artifact_id: artifact_id.into(),
parts,
name: None,
description: None,
metadata: None,
extensions: Vec::new(),
}
}
#[must_use]
pub fn create(parts: Vec<Part>) -> Self {
Self::new(ArtifactId::random(), parts)
}
pub fn text(artifact_id: impl Into<ArtifactId>, text: impl Into<String>) -> Self {
Self::new(artifact_id, vec![Part::text(text)])
}
#[must_use]
pub fn with_name(mut self, name: impl Into<String>) -> Self {
self.name = Some(name.into());
self
}
#[must_use]
pub fn with_description(mut self, description: impl Into<String>) -> Self {
self.description = Some(description.into());
self
}
}