Skip to main content

json_ld/algorithms/compaction/
document.rs

1use json_syntax::JsonValue;
2
3use crate::{
4	JsonLdBacktraceBuilder, JsonLdExpandedDocument, JsonLdFlattenedDocument, JsonLdLocatedError,
5	JsonLdProcessedContext,
6	algorithms::{AsyncJsonLdEnvironment, compaction::CompactFragment},
7	context::JsonLdEmbedContext,
8};
9
10use super::{Compactor, JsonLdCompact, JsonLdCompactionOptions};
11
12impl JsonLdExpandedDocument {
13	/// Compacts the input document with the given options, starting the location
14	/// backtrace at `location`.
15	pub async fn compact_with(
16		&self,
17		env: impl AsyncJsonLdEnvironment,
18		context: &JsonLdProcessedContext<'_>,
19		options: JsonLdCompactionOptions,
20		location: JsonLdBacktraceBuilder<'_>,
21	) -> Result<JsonValue, JsonLdLocatedError> {
22		let compactor = Compactor::new(context, options);
23
24		let compact = self
25			.objects()
26			.compact_fragment(&env, &compactor, location)
27			.await?;
28
29		let mut compact = compactor.wrap_in_graph(compact)?;
30		compact.embed_context(context.unprocessed())?;
31
32		Ok(compact)
33	}
34
35	/// Compacts the input document with the default options, starting the
36	/// location backtrace at `location`.
37	pub async fn compact(
38		&self,
39		env: impl AsyncJsonLdEnvironment,
40		context: &JsonLdProcessedContext<'_>,
41		location: JsonLdBacktraceBuilder<'_>,
42	) -> Result<JsonValue, JsonLdLocatedError> {
43		self.compact_with(env, context, JsonLdCompactionOptions::default(), location)
44			.await
45	}
46}
47
48impl JsonLdCompact for JsonLdExpandedDocument {
49	async fn compact_with(
50		&self,
51		env: impl AsyncJsonLdEnvironment,
52		context: &JsonLdProcessedContext<'_>,
53		options: JsonLdCompactionOptions,
54		location: JsonLdBacktraceBuilder<'_>,
55	) -> Result<JsonValue, JsonLdLocatedError> {
56		self.compact_with(env, context, options, location).await
57	}
58}
59
60impl JsonLdCompact for JsonLdFlattenedDocument {
61	async fn compact_with(
62		&self,
63		env: impl AsyncJsonLdEnvironment,
64		context: &JsonLdProcessedContext<'_>,
65		options: JsonLdCompactionOptions,
66		location: JsonLdBacktraceBuilder<'_>,
67	) -> Result<JsonValue, JsonLdLocatedError> {
68		let compactor = Compactor::new(context, options);
69
70		let compact = self.compact_fragment(&env, &compactor, location).await?;
71
72		let mut compact = compactor.wrap_in_graph(compact)?;
73		compact.embed_context(context.unprocessed())?;
74
75		Ok(compact)
76	}
77}