use crate::model::features::Featured;
use crate::model::graph::{Graph, GraphName};
use rdftk_iri::Iri;
use std::collections::HashMap;
use std::fmt::Debug;
#[derive(Clone, Debug, Default)]
pub struct DataSet {
graphs: HashMap<Option<GraphName>, Graph>,
}
impl From<Graph> for DataSet {
fn from(graphs: Graph) -> Self {
Self::from_iter([graphs])
}
}
impl From<Vec<Graph>> for DataSet {
fn from(graphs: Vec<Graph>) -> Self {
Self::from_iter(graphs)
}
}
impl From<HashMap<Option<GraphName>, Graph>> for DataSet {
fn from(graphs: HashMap<Option<GraphName>, Graph>) -> Self {
Self { graphs }
}
}
impl FromIterator<Graph> for DataSet {
fn from_iter<T: IntoIterator<Item = Graph>>(iter: T) -> Self {
Self::from(
iter.into_iter()
.map(|g| (g.name().cloned(), g))
.collect::<HashMap<Option<GraphName>, Graph>>(),
)
}
}
impl Featured for DataSet {
fn supports_feature(&self, _feature: &Iri) -> bool {
false
}
}
impl DataSet {
pub fn is_empty(&self) -> bool {
self.graphs.is_empty()
}
pub fn len(&self) -> usize {
self.graphs.len()
}
pub fn contains_graph(&self, name: &Option<GraphName>) -> bool {
self.graphs.contains_key(name)
}
pub fn has_default_graph(&self) -> bool {
self.contains_graph(&None)
}
pub fn has_graph_named(&self, name: &GraphName) -> bool {
self.contains_graph(&Some(name.clone()))
}
pub fn graph(&self, name: &Option<GraphName>) -> Option<&Graph> {
self.graphs.get(name)
}
pub fn graph_mut(&mut self, name: &Option<GraphName>) -> Option<&mut Graph> {
self.graphs.get_mut(name)
}
pub fn default_graph(&self) -> Option<&Graph> {
self.graph(&None)
}
pub fn graph_named(&self, name: &GraphName) -> Option<&Graph> {
self.graph(&Some(name.clone()))
}
pub fn graphs(&self) -> impl Iterator<Item = &Graph> {
self.graphs.values()
}
pub fn insert(&mut self, graph: Graph) {
let graph_name = graph.name().cloned();
let _ = self.graphs.insert(graph_name, graph);
}
pub fn extend(&mut self, graphs: Vec<Graph>) {
graphs.into_iter().for_each(|g| self.insert(g))
}
pub fn remove(&mut self, name: &Option<GraphName>) {
let _ = self.graphs.remove(name);
}
pub fn clear(&mut self) {
self.graphs.clear();
}
}