json_ld/core/document/
mod.rs1use hashbrown::HashSet;
2use json_syntax::{JsonCodeMap, JsonPrint, JsonValue, print::JsonPrintOptions};
3use mime::Mime;
4use rdf_syntax::{Iri, IriBuf};
5
6pub mod expanded;
7pub mod flattened;
8pub mod profile;
9
10pub use expanded::JsonLdExpandedDocument;
11pub use flattened::JsonLdFlattenedDocument;
12pub use profile::JsonLdProfile;
13
14use crate::syntax::JsonLdContextDocumentValue;
15
16#[derive(Debug, Clone)]
20pub struct JsonLdDocument<T = JsonValue> {
21 pub url: Option<IriBuf>,
23
24 pub content_type: Option<Mime>,
27
28 pub context_url: Option<IriBuf>,
38
39 pub profile: HashSet<JsonLdProfile>,
40
41 pub source: Option<JsonLdSourceCode>,
42
43 pub document: T,
45}
46
47pub type JsonLdContextDocument = JsonLdDocument<JsonLdContextDocumentValue>;
48
49impl<T> JsonLdDocument<T> {
50 pub fn new(url: Option<IriBuf>, content_type: Option<Mime>, document: T) -> Self {
57 Self::new_full(url, content_type, None, HashSet::new(), None, document)
58 }
59
60 pub fn new_full(
74 url: Option<IriBuf>,
75 content_type: Option<Mime>,
76 context_url: Option<IriBuf>,
77 profile: HashSet<JsonLdProfile>,
78 source: Option<JsonLdSourceCode>,
79 document: T,
80 ) -> Self {
81 Self {
82 url,
83 content_type,
84 context_url,
85 profile,
86 source,
87 document,
88 }
89 }
90
91 pub fn map<U>(self, f: impl Fn(T) -> U) -> JsonLdDocument<U> {
93 JsonLdDocument {
94 url: self.url,
95 content_type: self.content_type,
96 context_url: self.context_url,
97 profile: self.profile,
98 source: self.source,
99 document: f(self.document),
100 }
101 }
102
103 pub fn try_map<U, E>(self, f: impl Fn(T) -> Result<U, E>) -> Result<JsonLdDocument<U>, E> {
105 Ok(JsonLdDocument {
106 url: self.url,
107 content_type: self.content_type,
108 context_url: self.context_url,
109 profile: self.profile,
110 source: self.source,
111 document: f(self.document)?,
112 })
113 }
114
115 pub fn url(&self) -> Option<&Iri> {
117 self.url.as_deref()
118 }
119
120 pub fn content_type(&self) -> Option<&Mime> {
123 self.content_type.as_ref()
124 }
125
126 pub fn context_url(&self) -> Option<&Iri> {
137 self.context_url.as_deref()
138 }
139
140 pub fn document(&self) -> &T {
142 &self.document
143 }
144
145 pub fn document_mut(&mut self) -> &mut T {
147 &mut self.document
148 }
149
150 pub fn into_document(self) -> T {
152 self.document
153 }
154
155 pub fn into_url(self) -> Option<IriBuf> {
157 self.url
158 }
159
160 pub fn set_url(&mut self, url: Option<IriBuf>) {
162 self.url = url
163 }
164}
165
166impl JsonLdDocument {
167 #[cfg(feature = "serde")]
168 pub fn try_into_context_document(
169 self,
170 ) -> Result<JsonLdContextDocument, crate::syntax::serde::DeserializeError> {
171 Ok(JsonLdContextDocument {
172 url: self.url,
173 content_type: self.content_type,
174 context_url: self.context_url,
175 profile: self.profile,
176 source: self.source,
177 document: crate::syntax::from_value(self.document)?,
178 })
179 }
180}
181
182#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
183pub struct JsonLdSourceCode {
184 pub text: String,
185 pub code_map: JsonCodeMap,
186}
187
188impl JsonLdSourceCode {
189 pub fn new(text: String, code_map: JsonCodeMap) -> Self {
190 Self { text, code_map }
191 }
192
193 pub fn from_value(value: &JsonValue) -> Self {
194 JsonLdSourceCode {
195 text: value.pretty_print().to_string(),
196 code_map: JsonCodeMap::from_value(value, &JsonPrintOptions::PRETTY),
197 }
198 }
199}