1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
use definition::definition::Definition; use definition::ebucore::EbuCore; use definition::owl::Owl; use definition::rdf::Rdf; use definition::rdfs::Rdfs; use definition::xsi::Xsi; use rdf::graph::Graph; use rdf::namespace::Namespace; use rdf::node::Node; use rdf::triple::Triple; use rdf::uri::Uri; use rdf::writer::n_triples_writer::NTriplesWriter; use rdf::writer::rdf_writer::RdfWriter; use rdf::writer::turtle_writer::TurtleWriter; macro_rules! build { ($graph:expr, $namespace:expr, $label:expr) => ( $graph.add_namespace(&Namespace::new($label.to_string(), Uri::new($namespace.to_owned()))); ); (node => $graph:expr, $namespace:expr, $label:expr) => ( $graph.create_uri_node(&Uri::new(Definition::get_label(&$namespace, $label))) ) } #[derive(Debug)] pub struct Converter { pub graph: Graph } impl Converter { pub fn new() -> Converter { let ebucore = EbuCore{}; let owl = Owl{}; let rdf = Rdf{}; let rdfs = Rdfs{}; let xsi = Xsi{}; let mut graph = Graph::new(None); build!(graph, Definition::get_namespace(&rdf), "rdf"); build!(graph, Definition::get_namespace(&rdfs), "rdfs"); build!(graph, Definition::get_namespace(&owl), "owl"); build!(graph, Definition::get_namespace(&ebucore), "ebucore"); build!(graph, Definition::get_namespace(&xsi), "xsi"); build!(graph, "urn:ebu:metadata-schema:ebuCore_2012", "default"); Converter { graph: graph } } pub fn create_subject(&mut self, value: &str) -> Node { let subject = self.graph.create_uri_node(&Uri::new(value.to_string())); subject } pub fn add(&mut self, subject: &Node, namespace: &str, label: &str, content: String) { let predicate_namespace = match namespace { "ebucore" => EbuCore{}, _ => { panic!("unable to process namespace {:?}", namespace); }, }; let predicate = build!(node => self.graph, predicate_namespace, label); let object = self.graph.create_literal_node(content); let triple = Triple::new(&subject, &predicate, &object); self.graph.add_triple(&triple); } pub fn add_with_language(&mut self, subject: &Node, namespace: &str, label: &str, content: String, lang: &str) { let predicate_namespace = match namespace { "ebucore" => EbuCore{}, _ => { panic!("unable to process namespace {:?}", namespace); }, }; let predicate = build!(node => self.graph, predicate_namespace, label); let object = self.graph.create_literal_node_with_language(content, lang.to_string()); let triple = Triple::new(&subject, &predicate, &object); self.graph.add_triple(&triple); } pub fn add_with_datatype(&mut self, subject: &Node, namespace: &str, label: &str, content: String, datatype: &str) { let predicate_namespace = match namespace { "ebucore" => EbuCore{}, _ => { panic!("unable to process namespace {:?}", namespace); }, }; let predicate = build!(node => self.graph, predicate_namespace, label); let object = self.graph.create_literal_node_with_data_type(content, &Uri::new(datatype.to_string())); let triple = Triple::new(&subject, &predicate, &object); self.graph.add_triple(&triple); } pub fn to_ntriple_string(&self) -> String { let writer = NTriplesWriter::new(); writer.write_to_string(&self.graph).unwrap() } pub fn to_turtle_string(&self) -> String { let writer = TurtleWriter::new(self.graph.namespaces()); writer.write_to_string(&self.graph).unwrap() } }