linked-data 0.2.0

Linked-Data dateset serialization/deserialization traits
Documentation
use linked_data::{de::from_rdf_quads, ser::to_rdf_quads};
use linked_data_derive::{DeserializeLinkedData, SerializeLinkedData};
use rdf_syntax::{IriBuf, iri};

#[derive(Debug, PartialEq, SerializeLinkedData, DeserializeLinkedData)]
#[ld(prefix("ex" = "http://example.org/"))]
struct Foo {
	#[ld(flatten)]
	id: IriBuf,

	#[ld(prop = "ex:name")]
	name: String,

	#[ld(prop = "ex:bar")]
	bar: Bar,

	#[ld(flatten)]
	more: MoreFoo,

	#[ld(prop = "ex:recurse")]
	recurse: Vec<Foo>,
}

#[derive(Debug, PartialEq, SerializeLinkedData, DeserializeLinkedData)]
#[ld(prefix("ex" = "http://example.org/"))]
#[ld(type = "http://example.org/Bar")]
struct Bar {
	#[ld(flatten)]
	id: IriBuf,

	#[ld(prop = "ex:value")]
	value: u32,
}

#[derive(Debug, PartialEq, SerializeLinkedData, DeserializeLinkedData)]
#[ld(prefix("ex" = "http://example.org/"))]
struct MoreFoo {
	#[ld(prop = "ex:email")]
	email: String,
}

fn main() {
	let value = Foo {
		id: iri!("http://example.org/john.smith").to_owned(),
		name: "John Smith".to_string(),
		bar: Bar {
			id: iri!("http://example.org/myBar").to_owned(),
			value: 1,
		},
		more: MoreFoo {
			email: "john.smith@example.org".to_string(),
		},
		recurse: Vec::new(),
	};

	let quads = to_rdf_quads(&value).expect("RDF serialization failed");

	for quad in &quads {
		println!("{quad} .")
	}

	let value2: Foo = from_rdf_quads(quads, [value.id.clone().into()]).unwrap();

	assert_eq!(value, value2);
}