#![deny(missing_docs)]
#[cfg(feature = "pdfa")]
pub mod pdfa;
mod types;
use std::collections::BTreeSet;
use std::fmt::Write;
#[cfg(feature = "pdfa")]
use pdfa::PdfAExtSchemasWriter;
pub use types::*;
macro_rules! deref {
($a:lifetime, $b:lifetime, $from:ty => $to:ty, $field:ident) => {
impl<$a, $b> std::ops::Deref for $from {
type Target = $to;
#[inline]
fn deref(&self) -> &Self::Target {
&self.$field
}
}
impl<$a, $b> std::ops::DerefMut for $from {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.$field
}
}
};
}
pub(crate) use deref;
#[derive(Default)]
pub struct XmpWriter<'a> {
pub(crate) buf: String,
namespaces: BTreeSet<Namespace<'a>>,
}
impl<'n> XmpWriter<'n> {
pub fn new() -> XmpWriter<'n> {
Self::default()
}
#[inline]
pub fn element<'a>(
&'a mut self,
name: &'a str,
namespace: Namespace<'n>,
) -> Element<'a, 'n> {
Element::start(self, name, namespace)
}
pub fn finish(self, about: Option<&str>) -> String {
let mut buf = String::with_capacity(280 + self.buf.len());
buf.push_str("<?xpacket begin=\"\u{feff}\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>");
write!(
&mut buf,
"<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"xmp-writer\"><rdf:RDF xmlns:rdf=\"{}\"><rdf:Description rdf:about=\"{}\"",
Namespace::Rdf.url(),
about.unwrap_or(""),
)
.unwrap();
for namespace in self.namespaces.into_iter().filter(|ns| &Namespace::Rdf != ns) {
write!(&mut buf, " xmlns:{}=\"{}\" ", namespace.prefix(), namespace.url())
.unwrap();
}
buf.push('>');
buf.push_str(&self.buf);
buf.push_str("</rdf:Description></rdf:RDF></x:xmpmeta><?xpacket end=\"r\"?>");
buf
}
}
impl XmpWriter<'_> {
pub fn contributor<'a>(
&mut self,
contributor: impl IntoIterator<Item = &'a str>,
) -> &mut Self {
self.element("contributor", Namespace::DublinCore)
.unordered_array(contributor);
self
}
pub fn coverage(&mut self, coverage: &str) -> &mut Self {
self.element("coverage", Namespace::DublinCore).value(coverage);
self
}
pub fn creator<'a>(
&mut self,
creator: impl IntoIterator<Item = &'a str>,
) -> &mut Self {
self.element("creator", Namespace::DublinCore).ordered_array(creator);
self
}
pub fn date(&mut self, date: impl IntoIterator<Item = DateTime>) -> &mut Self {
self.element("date", Namespace::DublinCore).ordered_array(date);
self
}
pub fn description<'a>(
&mut self,
description: impl IntoIterator<Item = (Option<LangId<'a>>, &'a str)>,
) -> &mut Self {
self.element("description", Namespace::DublinCore)
.language_alternative(description);
self
}
pub fn format(&mut self, mime: &str) -> &mut Self {
self.element("format", Namespace::DublinCore).value(mime);
self
}
pub fn identifier(&mut self, id: &str) -> &mut Self {
self.element("identifier", Namespace::DublinCore).value(id);
self
}
pub fn language<'a>(
&mut self,
lang: impl IntoIterator<Item = LangId<'a>>,
) -> &mut Self {
self.element("language", Namespace::DublinCore).unordered_array(lang);
self
}
pub fn publisher<'a>(
&mut self,
publisher: impl IntoIterator<Item = &'a str>,
) -> &mut Self {
self.element("publisher", Namespace::DublinCore)
.unordered_array(publisher);
self
}
pub fn relation<'a>(
&mut self,
relation: impl IntoIterator<Item = &'a str>,
) -> &mut Self {
self.element("relation", Namespace::DublinCore)
.unordered_array(relation);
self
}
pub fn rights<'a>(
&mut self,
rights: impl IntoIterator<Item = (Option<LangId<'a>>, &'a str)>,
) -> &mut Self {
self.element("rights", Namespace::DublinCore)
.language_alternative(rights);
self
}
pub fn source(&mut self, source: &str) -> &mut Self {
self.element("source", Namespace::DublinCore).value(source);
self
}
pub fn subject<'a>(
&mut self,
subject: impl IntoIterator<Item = &'a str>,
) -> &mut Self {
self.element("subject", Namespace::DublinCore)
.unordered_array(subject);
self
}
pub fn title<'a>(
&mut self,
title: impl IntoIterator<Item = (Option<LangId<'a>>, &'a str)>,
) -> &mut Self {
self.element("title", Namespace::DublinCore)
.language_alternative(title);
self
}
pub fn type_<'a>(&mut self, kind: impl IntoIterator<Item = &'a str>) -> &mut Self {
self.element("type", Namespace::DublinCore).unordered_array(kind);
self
}
}
impl<'n> XmpWriter<'n> {
pub fn base_url(&mut self, url: &str) -> &mut Self {
self.element("BaseURL", Namespace::Xmp).value(url);
self
}
pub fn create_date(&mut self, date: DateTime) -> &mut Self {
self.element("CreateDate", Namespace::Xmp).value(date);
self
}
pub fn creator_tool(&mut self, tool: &str) -> &mut Self {
self.element("CreatorTool", Namespace::Xmp).value(tool);
self
}
pub fn xmp_identifier<'a>(
&mut self,
id: impl IntoIterator<Item = &'a str>,
) -> &mut Self {
self.element("Identifier", Namespace::Xmp).unordered_array(id);
self
}
pub fn label(&mut self, label: &str) -> &mut Self {
self.element("Label", Namespace::Xmp).value(label);
self
}
pub fn metadata_date(&mut self, date: DateTime) -> &mut Self {
self.element("MetadataDate", Namespace::Xmp).value(date);
self
}
pub fn modify_date(&mut self, date: DateTime) -> &mut Self {
self.element("ModifyDate", Namespace::Xmp).value(date);
self
}
pub fn nickname(&mut self, nickname: &str) -> &mut Self {
self.element("Nickname", Namespace::Xmp).value(nickname);
self
}
pub fn rating(&mut self, rating: i64) -> &mut Self {
self.element("Rating", Namespace::Xmp).value(rating);
self
}
pub fn thumbnails(&mut self) -> ThumbnailsWriter<'_, 'n> {
ThumbnailsWriter::start(
self.element("Thumbnails", Namespace::Xmp)
.array(RdfCollectionType::Alt),
)
}
}
impl XmpWriter<'_> {
pub fn certificate(&mut self, cert: &str) -> &mut Self {
self.element("Certificate", Namespace::XmpRights).value(cert);
self
}
pub fn marked(&mut self, marked: bool) -> &mut Self {
self.element("Marked", Namespace::XmpRights).value(marked);
self
}
pub fn owner<'a>(&mut self, owner: impl IntoIterator<Item = &'a str>) -> &mut Self {
self.element("Owner", Namespace::XmpRights).unordered_array(owner);
self
}
pub fn usage_terms<'a>(
&mut self,
terms: impl IntoIterator<Item = (Option<LangId<'a>>, &'a str)>,
) -> &mut Self {
self.element("UsageTerms", Namespace::XmpRights)
.language_alternative(terms);
self
}
pub fn web_statement(&mut self, statement: &str) -> &mut Self {
self.element("WebStatement", Namespace::XmpRights).value(statement);
self
}
}
impl<'n> XmpWriter<'n> {
pub fn derived_from(&mut self) -> ResourceRefWriter<'_, 'n> {
ResourceRefWriter::start(self.element("DerivedFrom", Namespace::XmpMedia).obj())
}
pub fn document_id(&mut self, id: &str) -> &mut Self {
self.element("DocumentID", Namespace::XmpMedia).value(id);
self
}
pub fn history(&mut self) -> ResourceEventsWriter<'_, 'n> {
ResourceEventsWriter::start(
self.element("History", Namespace::XmpMedia)
.array(RdfCollectionType::Seq),
)
}
pub fn ingredients(&mut self) -> ResourceRefsWriter<'_, 'n> {
ResourceRefsWriter::start(
self.element("Ingredients", Namespace::XmpMedia)
.array(RdfCollectionType::Bag),
)
}
pub fn instance_id(&mut self, id: &str) -> &mut Self {
self.element("InstanceID", Namespace::XmpMedia).value(id);
self
}
pub fn managed_from(&mut self) -> ResourceRefWriter<'_, 'n> {
ResourceRefWriter::start(self.element("ManagedFrom", Namespace::XmpMedia).obj())
}
pub fn manager(&mut self, manager: &str) -> &mut Self {
self.element("Manager", Namespace::XmpMedia).value(manager);
self
}
pub fn manage_to(&mut self, uri: &str) -> &mut Self {
self.element("ManageTo", Namespace::XmpMedia).value(uri);
self
}
pub fn manage_ui(&mut self, uri: &str) -> &mut Self {
self.element("ManageUI", Namespace::XmpMedia).value(uri);
self
}
pub fn manager_variant(&mut self, variant: &str) -> &mut Self {
self.element("ManagerVariant", Namespace::XmpMedia).value(variant);
self
}
pub fn original_doc_id(&mut self, id: &str) -> &mut Self {
self.element("OriginalDocumentID", Namespace::XmpMedia).value(id);
self
}
pub fn pantry(&mut self) -> PantryWriter<'_, 'n> {
PantryWriter::start(
self.element("Pantry", Namespace::XmpMedia)
.array(RdfCollectionType::Bag),
)
}
pub fn rendition_class(&mut self, class: RenditionClass) -> &mut Self {
self.element("RenditionClass", Namespace::XmpMedia).value(class);
self
}
pub fn rendition_params(&mut self, params: &str) -> &mut Self {
self.element("RenditionParams", Namespace::XmpMedia).value(params);
self
}
pub fn version_id(&mut self, id: &str) -> &mut Self {
self.element("VersionID", Namespace::XmpMedia).value(id);
self
}
pub fn version_ref(&mut self) -> VersionsWriter<'_, 'n> {
VersionsWriter::start(
self.element("Versions", Namespace::XmpMedia)
.array(RdfCollectionType::Seq),
)
}
}
impl<'n> XmpWriter<'n> {
pub fn jobs(&mut self) -> JobsWriter<'_, 'n> {
JobsWriter::start(
self.element("Job", Namespace::XmpJobManagement)
.array(RdfCollectionType::Bag),
)
}
}
impl<'n> XmpWriter<'n> {
pub fn colorants(&mut self) -> ColorantsWriter<'_, 'n> {
ColorantsWriter::start(
self.element("Colorants", Namespace::XmpPaged)
.array(RdfCollectionType::Seq),
)
}
pub fn fonts(&mut self) -> FontsWriter<'_, 'n> {
FontsWriter::start(
self.element("Fonts", Namespace::XmpPaged)
.array(RdfCollectionType::Bag),
)
}
pub fn max_page_size(&mut self) -> DimensionsWriter<'_, 'n> {
DimensionsWriter::start(self.element("MaxPageSize", Namespace::XmpPaged).obj())
}
pub fn num_pages(&mut self, num: u32) -> &mut Self {
self.element("NPages", Namespace::XmpPaged).value(num as i64);
self
}
pub fn plate_names<'a>(
&mut self,
names: impl IntoIterator<Item = &'a str>,
) -> &mut Self {
self.element("PlateNames", Namespace::XmpPaged).ordered_array(names);
self
}
}
impl XmpWriter<'_> {
pub fn idq_scheme(&mut self, scheme: &str) -> &mut Self {
self.element("Scheme", Namespace::XmpIdq).value(scheme);
self
}
}
impl XmpWriter<'_> {
pub fn pdf_keywords(&mut self, keywords: &str) -> &mut Self {
self.element("Keywords", Namespace::AdobePdf).value(keywords);
self
}
pub fn pdf_version(&mut self, version: &str) -> &mut Self {
self.element("PDFVersion", Namespace::AdobePdf).value(version);
self
}
pub fn producer(&mut self, producer: &str) -> &mut Self {
self.element("Producer", Namespace::AdobePdf).value(producer);
self
}
pub fn trapped(&mut self, trapped: bool) -> &mut Self {
self.element("Trapped", Namespace::AdobePdf).value(trapped);
self
}
}
impl<'n> XmpWriter<'n> {
#[cfg(feature = "pdfa")]
pub fn pdfa_part(&mut self, part: i32) -> &mut Self {
self.element("part", Namespace::PdfAId).value(part);
self
}
#[cfg(feature = "pdfa")]
pub fn pdfa_amd(&mut self, amd: &str) -> &mut Self {
self.element("amd", Namespace::PdfAId).value(amd);
self
}
#[cfg(feature = "pdfa")]
pub fn pdfa_corr(&mut self, corr: &str) -> &mut Self {
self.element("corr", Namespace::PdfAId).value(corr);
self
}
#[cfg(feature = "pdfa")]
pub fn extension_schemas(&mut self) -> PdfAExtSchemasWriter<'_, 'n> {
PdfAExtSchemasWriter::start(
self.element("schemas", Namespace::PdfAExtension)
.array(RdfCollectionType::Bag),
)
}
#[cfg(feature = "pdfa")]
pub fn pdfa_conformance(&mut self, conformance: &str) -> &mut Self {
self.element("conformance", Namespace::PdfAId).value(conformance);
self
}
#[cfg(feature = "pdfa")]
pub fn pdfa_rev(&mut self, rev: i32) -> &mut Self {
self.element("rev", Namespace::PdfAId).value(rev);
self
}
pub fn pdfx_version(&mut self, version: &str) -> &mut Self {
self.element("GTS_PDFXVersion", Namespace::PdfXId).value(version);
self
}
pub fn pdfua_part(&mut self, part: i32) -> &mut Self {
self.element("part", Namespace::PdfUAId).value(part);
self
}
pub fn pdfua_amd(&mut self, amd: &str) -> &mut Self {
self.element("amd", Namespace::PdfUAId).value(amd);
self
}
pub fn pdfua_corr(&mut self, corr: &str) -> &mut Self {
self.element("corr", Namespace::PdfUAId).value(corr);
self
}
pub fn pdfua_rev(&mut self, rev: i32) -> &mut Self {
self.element("rev", Namespace::PdfUAId).value(rev);
self
}
}
pub struct ThumbnailWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n: 'a> ThumbnailWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn format(&mut self, format: &str) -> &mut Self {
self.stc.element("format", Namespace::XmpImage).value(format);
self
}
pub fn format_jpeg(&mut self) -> &mut Self {
self.format("JPEG")
}
pub fn width(&mut self, width: u64) -> &mut Self {
self.stc.element("width", Namespace::XmpImage).value(width as i64);
self
}
pub fn height(&mut self, height: u64) -> &mut Self {
self.stc.element("height", Namespace::XmpImage).value(height as i64);
self
}
pub fn image(&mut self, image: &str) -> &mut Self {
self.stc.element("image", Namespace::XmpImage).value(image);
self
}
}
deref!('a, 'n, ThumbnailWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct ThumbnailsWriter<'a, 'n: 'a> {
array: Array<'a, 'n>,
}
impl<'a, 'n: 'a> ThumbnailsWriter<'a, 'n> {
fn start(array: Array<'a, 'n>) -> Self {
Self { array }
}
pub fn add_thumbnail(&mut self) -> ThumbnailWriter<'_, 'n> {
ThumbnailWriter::start(self.array.element().obj())
}
}
deref!('a, 'n, ThumbnailsWriter<'a, 'n> => Array<'a, 'n>, array);
pub struct ResourceRefWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n: 'a> ResourceRefWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn alternate_paths<'b>(
&mut self,
paths: impl IntoIterator<Item = &'b str>,
) -> &mut Self {
self.stc
.element("alternatePaths", Namespace::XmpResourceRef)
.ordered_array(paths);
self
}
pub fn document_id(&mut self, id: &str) -> &mut Self {
self.stc.element("documentID", Namespace::XmpResourceRef).value(id);
self
}
pub fn file_path(&mut self, path: &str) -> &mut Self {
self.stc.element("filePath", Namespace::XmpResourceRef).value(path);
self
}
pub fn instance_id(&mut self, id: &str) -> &mut Self {
self.stc.element("instanceID", Namespace::XmpResourceRef).value(id);
self
}
pub fn last_modify_date(&mut self, date: DateTime) -> &mut Self {
self.stc
.element("lastModifyDate", Namespace::XmpResourceRef)
.value(date);
self
}
pub fn manager(&mut self, manager: &str) -> &mut Self {
self.stc.element("manager", Namespace::XmpResourceRef).value(manager);
self
}
pub fn manager_variant(&mut self, variant: &str) -> &mut Self {
self.stc
.element("managerVariant", Namespace::XmpResourceRef)
.value(variant);
self
}
pub fn manage_to(&mut self, uri: &str) -> &mut Self {
self.stc.element("manageTo", Namespace::XmpResourceRef).value(uri);
self
}
pub fn manage_ui(&mut self, uri: &str) -> &mut Self {
self.stc.element("manageTo", Namespace::XmpResourceRef).value(uri);
self
}
pub fn mask_markers(&mut self, markers: MaskMarkers) -> &mut Self {
self.stc
.element("maskMarkers", Namespace::XmpResourceRef)
.value(markers);
self
}
pub fn part_mapping(&mut self, mapping: &str) -> &mut Self {
self.stc
.element("partMapping", Namespace::XmpResourceRef)
.value(mapping);
self
}
pub fn rendition_class(&mut self, rendition: RenditionClass) -> &mut Self {
self.stc
.element("renditionClass", Namespace::XmpResourceRef)
.value(rendition);
self
}
pub fn rendition_params(&mut self, params: &str) -> &mut Self {
self.stc
.element("renditionParams", Namespace::XmpResourceRef)
.value(params);
self
}
pub fn to_part(&mut self, part: &str) -> &mut Self {
self.stc.element("toPart", Namespace::XmpResourceRef).value(part);
self
}
pub fn version_id(&mut self, id: &str) -> &mut Self {
self.stc.element("versionID", Namespace::XmpResourceRef).value(id);
self
}
}
deref!('a, 'n, ResourceRefWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct ResourceRefsWriter<'a, 'n: 'a> {
array: Array<'a, 'n>,
}
impl<'a, 'n: 'a> ResourceRefsWriter<'a, 'n> {
fn start(array: Array<'a, 'n>) -> Self {
Self { array }
}
pub fn add_ref(&mut self) -> ResourceRefWriter<'_, 'n> {
ResourceRefWriter::start(self.array.element().obj())
}
}
deref!('a, 'n, ResourceRefsWriter<'a, 'n> => Array<'a, 'n>, array);
pub struct ResourceEventWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n: 'a> ResourceEventWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn action(&mut self, action: ResourceEventAction) -> &mut Self {
self.stc.element("action", Namespace::XmpResourceEvent).value(action);
self
}
pub fn changed(&mut self, parts: &str) -> &mut Self {
self.stc.element("changed", Namespace::XmpResourceEvent).value(parts);
self
}
pub fn instance_id(&mut self, id: &str) -> &mut Self {
self.stc.element("instanceID", Namespace::XmpResourceEvent).value(id);
self
}
pub fn parameters(&mut self, params: &str) -> &mut Self {
self.stc
.element("parameters", Namespace::XmpResourceEvent)
.value(params);
self
}
pub fn software_agent(&mut self, agent: &str) -> &mut Self {
self.stc
.element("softwareAgent", Namespace::XmpResourceEvent)
.value(agent);
self
}
pub fn when(&mut self, date: DateTime) -> &mut Self {
self.stc.element("when", Namespace::XmpResourceEvent).value(date);
self
}
}
deref!('a, 'n, ResourceEventWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct ResourceEventsWriter<'a, 'n: 'a> {
array: Array<'a, 'n>,
}
impl<'a, 'n: 'a> ResourceEventsWriter<'a, 'n> {
fn start(array: Array<'a, 'n>) -> Self {
Self { array }
}
pub fn add_event(&mut self) -> ResourceEventWriter<'_, 'n> {
ResourceEventWriter::start(self.array.element().obj())
}
}
deref!('a, 'n, ResourceEventsWriter<'a, 'n> => Array<'a, 'n>, array);
pub struct PantryItemWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n: 'a> PantryItemWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn instance_id(&mut self, id: &str) -> &mut Self {
self.stc.element("instanceID", Namespace::XmpMedia).value(id);
self
}
}
deref!('a, 'n, PantryItemWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct PantryWriter<'a, 'n: 'a> {
array: Array<'a, 'n>,
}
impl<'a, 'n: 'a> PantryWriter<'a, 'n> {
fn start(array: Array<'a, 'n>) -> Self {
Self { array }
}
pub fn add_item(&mut self) -> PantryItemWriter<'_, 'n> {
PantryItemWriter::start(self.array.element().obj())
}
}
deref!('a, 'n, PantryWriter<'a, 'n> => Array<'a, 'n>, array);
pub struct VersionWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n: 'a> VersionWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn comments(&mut self, comments: &str) -> &mut Self {
self.stc.element("comments", Namespace::XmpVersion).value(comments);
self
}
pub fn event(&mut self) -> ResourceEventWriter<'_, 'n> {
ResourceEventWriter::start(self.stc.element("event", Namespace::XmpVersion).obj())
}
pub fn modifier(&mut self, modifier: &str) -> &mut Self {
self.stc.element("modifier", Namespace::XmpVersion).value(modifier);
self
}
pub fn modify_date(&mut self, date: DateTime) -> &mut Self {
self.stc.element("modifyDate", Namespace::XmpVersion).value(date);
self
}
pub fn version(&mut self, version: &str) -> &mut Self {
self.stc.element("version", Namespace::XmpVersion).value(version);
self
}
}
deref!('a, 'n, VersionWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct VersionsWriter<'a, 'n: 'a> {
array: Array<'a, 'n>,
}
impl<'a, 'n: 'a> VersionsWriter<'a, 'n> {
fn start(array: Array<'a, 'n>) -> Self {
Self { array }
}
pub fn add_version(&mut self) -> VersionWriter<'_, 'n> {
VersionWriter::start(self.array.element().obj())
}
}
deref!('a, 'n, VersionsWriter<'a, 'n> => Array<'a, 'n>, array);
pub struct JobWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n: 'a> JobWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn id(&mut self, id: &str) -> &mut Self {
self.stc.element("id", Namespace::XmpJob).value(id);
self
}
pub fn name(&mut self, name: &str) -> &mut Self {
self.stc.element("name", Namespace::XmpJob).value(name);
self
}
pub fn url(&mut self, url: &str) -> &mut Self {
self.stc.element("url", Namespace::XmpJob).value(url);
self
}
}
deref!('a, 'n, JobWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct JobsWriter<'a, 'n: 'a> {
array: Array<'a, 'n>,
}
impl<'a, 'n: 'a> JobsWriter<'a, 'n> {
fn start(array: Array<'a, 'n>) -> Self {
Self { array }
}
pub fn add_job(&mut self) -> JobWriter<'_, 'n> {
JobWriter::start(self.array.element().obj())
}
}
deref!('a, 'n, JobsWriter<'a, 'n> => Array<'a, 'n>, array);
pub struct ColorantWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n: 'a> ColorantWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn type_(&mut self, kind: ColorantType) -> &mut Self {
self.stc.element("type", Namespace::XmpColorant).value(kind);
self
}
pub fn swatch_name(&mut self, name: &str) -> &mut Self {
self.stc.element("swatchName", Namespace::XmpColorant).value(name);
self
}
pub fn colorant_mode(&mut self, mode: ColorantMode) -> &mut Self {
self.stc.element("colorantMode", Namespace::XmpColorant).value(mode);
self
}
pub fn l(&mut self, l: f64) -> &mut Self {
self.stc.element("L", Namespace::XmpColorant).value(l);
self
}
pub fn a(&mut self, a: i32) -> &mut Self {
self.stc.element("A", Namespace::XmpColorant).value(a);
self
}
pub fn b(&mut self, b: i32) -> &mut Self {
self.stc.element("B", Namespace::XmpColorant).value(b);
self
}
pub fn black(&mut self, black: f64) -> &mut Self {
self.stc.element("black", Namespace::XmpColorant).value(black);
self
}
pub fn cyan(&mut self, cyan: f64) -> &mut Self {
self.stc.element("cyan", Namespace::XmpColorant).value(cyan);
self
}
pub fn magenta(&mut self, magenta: f64) -> &mut Self {
self.stc.element("magenta", Namespace::XmpColorant).value(magenta);
self
}
pub fn yellow(&mut self, yellow: f64) -> &mut Self {
self.stc.element("yellow", Namespace::XmpColorant).value(yellow);
self
}
pub fn red(&mut self, red: i32) -> &mut Self {
self.stc.element("red", Namespace::XmpColorant).value(red);
self
}
pub fn green(&mut self, green: i32) -> &mut Self {
self.stc.element("green", Namespace::XmpColorant).value(green);
self
}
pub fn blue(&mut self, blue: i32) -> &mut Self {
self.stc.element("blue", Namespace::XmpColorant).value(blue);
self
}
}
deref!('a, 'n, ColorantWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct ColorantsWriter<'a, 'n: 'a> {
array: Array<'a, 'n>,
}
impl<'a, 'n> ColorantsWriter<'a, 'n> {
fn start(array: Array<'a, 'n>) -> Self {
Self { array }
}
pub fn add_colorant(&mut self) -> ColorantWriter<'_, 'n> {
ColorantWriter::start(self.array.element().obj())
}
}
deref!('a, 'n, ColorantsWriter<'a, 'n> => Array<'a, 'n>, array);
pub struct DimensionsWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n> DimensionsWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn width(&mut self, width: f64) -> &mut Self {
self.stc.element("w", Namespace::XmpDimensions).value(width);
self
}
pub fn height(&mut self, height: f64) -> &mut Self {
self.stc.element("h", Namespace::XmpDimensions).value(height);
self
}
pub fn unit(&mut self, unit: DimensionUnit) -> &mut Self {
self.stc.element("unit", Namespace::XmpDimensions).value(unit);
self
}
}
deref!('a, 'n, DimensionsWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct FontWriter<'a, 'n: 'a> {
stc: Struct<'a, 'n>,
}
impl<'a, 'n: 'a> FontWriter<'a, 'n> {
fn start(stc: Struct<'a, 'n>) -> Self {
Self { stc }
}
pub fn child_font_files<'b>(
&mut self,
files: impl IntoIterator<Item = &'b str>,
) -> &mut Self {
self.stc
.element("childFontFiles", Namespace::XmpFont)
.ordered_array(files);
self
}
pub fn composite(&mut self, composite: bool) -> &mut Self {
self.stc.element("composite", Namespace::XmpFont).value(composite);
self
}
pub fn font_face(&mut self, face: &str) -> &mut Self {
self.stc.element("fontFace", Namespace::XmpFont).value(face);
self
}
pub fn font_family(&mut self, family: &str) -> &mut Self {
self.stc.element("fontFamily", Namespace::XmpFont).value(family);
self
}
pub fn font_file(&mut self, file_name: &str) -> &mut Self {
self.stc.element("fontFileName", Namespace::XmpFont).value(file_name);
self
}
pub fn font_name(&mut self, name: &str) -> &mut Self {
self.stc.element("fontName", Namespace::XmpFont).value(name);
self
}
pub fn font_type(&mut self, font_type: FontType) -> &mut Self {
self.stc.element("fontType", Namespace::XmpFont).value(font_type);
self
}
pub fn version_string(&mut self, version: &str) -> &mut Self {
self.stc.element("versionString", Namespace::XmpFont).value(version);
self
}
}
deref!('a, 'n, FontWriter<'a, 'n> => Struct<'a, 'n>, stc);
pub struct FontsWriter<'a, 'n: 'a> {
array: Array<'a, 'n>,
}
impl<'a, 'n: 'a> FontsWriter<'a, 'n> {
fn start(array: Array<'a, 'n>) -> Self {
Self { array }
}
pub fn add_font(&mut self) -> FontWriter<'_, 'n> {
FontWriter::start(self.array.element().obj())
}
}
deref!('a, 'n, FontsWriter<'a, 'n> => Array<'a, 'n>, array);