"1" .')
-/// >>> list(parse(input, "text/turtle", base_iri="http://example.com/"))
-/// [ predicate= object=>>]
-#[pyfunction]
-#[pyo3(signature = (input, mime_type, *, base_iri = None))]
-pub fn parse(
- input: PyObject,
- mime_type: &str,
- base_iri: Option<&str>,
- py: Python<'_>,
-) -> PyResult {
- let input = if let Ok(path) = input.extract::(py) {
- PyReadable::from_file(&path, py).map_err(map_io_err)?
- } else {
- PyReadable::from_data(input, py)
- };
- if let Some(graph_format) = GraphFormat::from_media_type(mime_type) {
- let mut parser = GraphParser::from_format(graph_format);
- if let Some(base_iri) = base_iri {
- parser = parser
- .with_base_iri(base_iri)
- .map_err(|e| PyValueError::new_err(e.to_string()))?;
- }
- Ok(PyTripleReader {
- inner: py.allow_threads(|| parser.read_triples(input).map_err(map_parse_error))?,
- }
- .into_py(py))
- } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) {
- let mut parser = DatasetParser::from_format(dataset_format);
- if let Some(base_iri) = base_iri {
- parser = parser
- .with_base_iri(base_iri)
- .map_err(|e| PyValueError::new_err(e.to_string()))?;
- }
- Ok(PyQuadReader {
- inner: py.allow_threads(|| parser.read_quads(input).map_err(map_parse_error))?,
- }
- .into_py(py))
- } else {
- Err(PyValueError::new_err(format!(
- "Not supported MIME type: {mime_type}"
- )))
- }
-}
-
-/// Serializes an RDF graph or dataset.
-///
-/// It currently supports the following formats:
-///
-/// * `N-Triples `_ (``application/n-triples``)
-/// * `N-Quads `_ (``application/n-quads``)
-/// * `Turtle `_ (``text/turtle``)
-/// * `TriG `_ (``application/trig``)
-/// * `RDF/XML `_ (``application/rdf+xml``)
-///
-/// It supports also some MIME type aliases.
-/// For example, ``application/turtle`` could also be used for `Turtle `_
-/// and ``application/xml`` for `RDF/XML `_.
-///
-/// :param input: the RDF triples and quads to serialize.
-/// :type input: iterable(Triple) or iterable(Quad)
-/// :param output: The binary I/O object or file path to write to. For example, it could be a file path as a string or a file writer opened in binary mode with ``open('my_file.ttl', 'wb')``.
-/// :type output: io(bytes) or str or pathlib.Path
-/// :param mime_type: the MIME type of the RDF serialization.
-/// :type mime_type: str
-/// :rtype: None
-/// :raises ValueError: if the MIME type is not supported.
-/// :raises TypeError: if a triple is given during a quad format serialization or reverse.
-///
-/// >>> output = io.BytesIO()
-/// >>> serialize([Triple(NamedNode('http://example.com'), NamedNode('http://example.com/p'), Literal('1'))], output, "text/turtle")
-/// >>> output.getvalue()
-/// b' "1" .\n'
-#[pyfunction]
-pub fn serialize(input: &PyAny, output: PyObject, mime_type: &str, py: Python<'_>) -> PyResult<()> {
- let output = if let Ok(path) = output.extract::(py) {
- PyWritable::from_file(&path, py).map_err(map_io_err)?
- } else {
- PyWritable::from_data(output)
- };
- if let Some(graph_format) = GraphFormat::from_media_type(mime_type) {
- let mut writer = GraphSerializer::from_format(graph_format)
- .triple_writer(output)
- .map_err(map_io_err)?;
- for i in input.iter()? {
- writer
- .write(&*i?.extract::>()?)
- .map_err(map_io_err)?;
- }
- writer.finish().map_err(map_io_err)?;
- Ok(())
- } else if let Some(dataset_format) = DatasetFormat::from_media_type(mime_type) {
- let mut writer = DatasetSerializer::from_format(dataset_format)
- .quad_writer(output)
- .map_err(map_io_err)?;
- for i in input.iter()? {
- writer
- .write(&*i?.extract::>()?)
- .map_err(map_io_err)?;
- }
- writer.finish().map_err(map_io_err)?;
- Ok(())
- } else {
- Err(PyValueError::new_err(format!(
- "Not supported MIME type: {mime_type}"
- )))
- }
-}
-
-#[pyclass(name = "TripleReader", module = "pyoxigraph")]
-pub struct PyTripleReader {
- inner: TripleReader,
-}
-
-#[pymethods]
-impl PyTripleReader {
- fn __iter__(slf: PyRef<'_, Self>) -> PyRef {
- slf
- }
-
- fn __next__(&mut self, py: Python<'_>) -> PyResult