linked-data-next 0.2.0

Linked-Data dateset serialization/deserialization traits
Documentation
use iref::IriBuf;
use linked_data_next::{LinkedDataDeserializeSubject, to_quads};
use linked_data_next_derive::{Deserialize, Serialize};
use rdf_types::dataset::{IndexedBTreeDataset, TraversableDataset};
use rdf_types::{RdfDisplay, Term, generator};

#[derive(Debug, Serialize, Deserialize)]
#[ld(prefix("ex" = "http://example.org/"))]
struct Foo {
	#[ld(id)]
	id: IriBuf,
	#[ld("ex:name")]
	name: String,
	#[ld("ex:email")]
	emails: Vec<String>,
}

fn main() {
	let mut dataset = IndexedBTreeDataset::new();

	let id_1 = IriBuf::new("http://example.org/john".to_string()).unwrap();

	let value_1 = Foo {
		id: id_1.clone(),
		name: "John Smith".to_string(),
		emails: vec!["john.smith@mail.me".to_string()],
	};

	to_quads(
		generator::Blank::new_with_prefix("john-".to_string()),
		&value_1,
	)
	.expect("RDF serialization failed")
	.into_iter()
	.for_each(|rdf_quad| {
		let quad = rdf_types::Quad(
			Term::Id(rdf_quad.0),
			Term::iri(rdf_quad.1),
			rdf_quad.2,
			rdf_quad.3.map(Term::Id),
		);

		dataset.insert(quad);
	});

	let id_2 = IriBuf::new("http://example.org/joe".to_string()).unwrap();

	let value_2 = Foo {
		id: id_2.clone(),
		name: "Joe Dalton".to_string(),
		emails: vec!["joe.dalton@mail.me".to_string()],
	};

	to_quads(
		generator::Blank::new_with_prefix("joe-".to_string()),
		&value_2,
	)
	.expect("RDF serialization failed")
	.into_iter()
	.for_each(|rdf_quad| {
		let quad = rdf_types::Quad(
			Term::Id(rdf_quad.0),
			Term::iri(rdf_quad.1),
			rdf_quad.2,
			rdf_quad.3.map(Term::Id),
		);

		dataset.insert(quad);
	});

	let resources = [Term::iri(id_1), Term::iri(id_2)];

	println!("{}", "#".repeat(50));
	for quad in dataset.quads() {
		println!("{} .", quad.rdf_display())
	}

	let objects = Foo::deserialize_subjects(&(), &(), &dataset, None, resources).unwrap();

	println!("{}", "#".repeat(50));
	println!("{objects:#?}");
}