oxigraph/io/write.rs
1#![allow(deprecated)]
2
3//! Utilities to write RDF graphs and datasets.
4
5use crate::io::{DatasetFormat, GraphFormat};
6use crate::model::*;
7use oxrdfio::{RdfSerializer, WriterQuadSerializer};
8use std::io::{self, Write};
9
10/// A serializer for RDF graph serialization formats.
11///
12/// It currently supports the following formats:
13/// * [N-Triples](https://www.w3.org/TR/n-triples/) ([`GraphFormat::NTriples`])
14/// * [Turtle](https://www.w3.org/TR/turtle/) ([`GraphFormat::Turtle`])
15/// * [RDF/XML](https://www.w3.org/TR/rdf-syntax-grammar/) ([`GraphFormat::RdfXml`])
16///
17/// ```
18/// use oxigraph::io::{GraphFormat, GraphSerializer};
19/// use oxigraph::model::*;
20///
21/// let mut buffer = Vec::new();
22/// let mut serializer =
23/// GraphSerializer::from_format(GraphFormat::NTriples).triple_writer(&mut buffer);
24/// serializer.write(&Triple {
25/// subject: NamedNode::new("http://example.com/s")?.into(),
26/// predicate: NamedNode::new("http://example.com/p")?,
27/// object: NamedNode::new("http://example.com/o")?.into(),
28/// })?;
29/// serializer.finish()?;
30///
31/// assert_eq!(
32/// buffer.as_slice(),
33/// "<http://example.com/s> <http://example.com/p> <http://example.com/o> .\n".as_bytes()
34/// );
35/// # Result::<_, Box<dyn std::error::Error>>::Ok(())
36/// ```
37#[deprecated(note = "use RdfSerializer instead", since = "0.4.0")]
38pub struct GraphSerializer {
39 inner: RdfSerializer,
40}
41
42impl GraphSerializer {
43 /// Builds a serializer for the given format
44 #[inline]
45 pub fn from_format(format: GraphFormat) -> Self {
46 Self {
47 inner: RdfSerializer::from_format(format.into()),
48 }
49 }
50
51 /// Returns a [`TripleWriter`] allowing writing triples into the given [`Write`] implementation
52 pub fn triple_writer<W: Write>(self, writer: W) -> TripleWriter<W> {
53 TripleWriter {
54 serializer: self.inner.for_writer(writer),
55 }
56 }
57}
58
59/// Allows writing triples.
60/// Could be built using a [`GraphSerializer`].
61///
62/// <div class="warning">
63///
64/// Do not forget to run the [`finish`](TripleWriter::finish()) method to properly write the last bytes of the file.</div>
65///
66/// ```
67/// use oxigraph::io::{GraphFormat, GraphSerializer};
68/// use oxigraph::model::*;
69///
70/// let mut buffer = Vec::new();
71/// let mut serializer =
72/// GraphSerializer::from_format(GraphFormat::NTriples).triple_writer(&mut buffer);
73/// serializer.write(&Triple {
74/// subject: NamedNode::new("http://example.com/s")?.into(),
75/// predicate: NamedNode::new("http://example.com/p")?,
76/// object: NamedNode::new("http://example.com/o")?.into(),
77/// })?;
78/// serializer.finish()?;
79///
80/// assert_eq!(
81/// buffer.as_slice(),
82/// "<http://example.com/s> <http://example.com/p> <http://example.com/o> .\n".as_bytes()
83/// );
84/// # Result::<_, Box<dyn std::error::Error>>::Ok(())
85/// ```
86#[must_use]
87pub struct TripleWriter<W: Write> {
88 serializer: WriterQuadSerializer<W>,
89}
90
91impl<W: Write> TripleWriter<W> {
92 /// Writes a triple
93 pub fn write<'a>(&mut self, triple: impl Into<TripleRef<'a>>) -> io::Result<()> {
94 self.serializer.serialize_triple(triple)
95 }
96
97 /// Writes the last bytes of the file
98 pub fn finish(self) -> io::Result<()> {
99 self.serializer.finish()?.flush()
100 }
101}
102
103/// A serializer for RDF graph serialization formats.
104///
105/// It currently supports the following formats:
106/// * [N-Quads](https://www.w3.org/TR/n-quads/) ([`DatasetFormat::NQuads`])
107/// * [TriG](https://www.w3.org/TR/trig/) ([`DatasetFormat::TriG`])
108///
109/// ```
110/// use oxigraph::io::{DatasetFormat, DatasetSerializer};
111/// use oxigraph::model::*;
112///
113/// let mut buffer = Vec::new();
114/// let mut serializer = DatasetSerializer::from_format(DatasetFormat::NQuads).quad_writer(&mut buffer);
115/// serializer.write(&Quad {
116/// subject: NamedNode::new("http://example.com/s")?.into(),
117/// predicate: NamedNode::new("http://example.com/p")?,
118/// object: NamedNode::new("http://example.com/o")?.into(),
119/// graph_name: NamedNode::new("http://example.com/g")?.into(),
120/// })?;
121/// serializer.finish()?;
122///
123/// assert_eq!(buffer.as_slice(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n".as_bytes());
124/// # Result::<_, Box<dyn std::error::Error>>::Ok(())
125/// ```
126#[deprecated(note = "use RdfSerializer instead", since = "0.4.0")]
127pub struct DatasetSerializer {
128 inner: RdfSerializer,
129}
130
131impl DatasetSerializer {
132 /// Builds a serializer for the given format
133 #[inline]
134 pub fn from_format(format: DatasetFormat) -> Self {
135 Self {
136 inner: RdfSerializer::from_format(format.into()),
137 }
138 }
139
140 /// Returns a [`QuadWriter`] allowing writing triples into the given [`Write`] implementation
141 pub fn quad_writer<W: Write>(self, writer: W) -> QuadWriter<W> {
142 QuadWriter {
143 serializer: self.inner.for_writer(writer),
144 }
145 }
146}
147
148/// Allows writing triples.
149/// Could be built using a [`DatasetSerializer`].
150///
151/// <div class="warning">
152///
153/// Do not forget to run the [`finish`](QuadWriter::finish()) method to properly write the last bytes of the file.</div>
154///
155/// ```
156/// use oxigraph::io::{DatasetFormat, DatasetSerializer};
157/// use oxigraph::model::*;
158///
159/// let mut buffer = Vec::new();
160/// let mut serializer = DatasetSerializer::from_format(DatasetFormat::NQuads).quad_writer(&mut buffer);
161/// serializer.write(&Quad {
162/// subject: NamedNode::new("http://example.com/s")?.into(),
163/// predicate: NamedNode::new("http://example.com/p")?,
164/// object: NamedNode::new("http://example.com/o")?.into(),
165/// graph_name: NamedNode::new("http://example.com/g")?.into(),
166/// })?;
167/// serializer.finish()?;
168///
169/// assert_eq!(buffer.as_slice(), "<http://example.com/s> <http://example.com/p> <http://example.com/o> <http://example.com/g> .\n".as_bytes());
170/// # Result::<_, Box<dyn std::error::Error>>::Ok(())
171/// ```
172#[must_use]
173pub struct QuadWriter<W: Write> {
174 serializer: WriterQuadSerializer<W>,
175}
176
177impl<W: Write> QuadWriter<W> {
178 /// Writes a quad
179 pub fn write<'a>(&mut self, quad: impl Into<QuadRef<'a>>) -> io::Result<()> {
180 self.serializer.serialize_quad(quad)
181 }
182
183 /// Writes the last bytes of the file
184 pub fn finish(self) -> io::Result<()> {
185 self.serializer.finish()?.flush()
186 }
187}