use std::fmt::{Display, Formatter};
use crate::prelude::*;
use crate::protocols::contextuable::{Datable, SpaceTemporal, Spatial, Temporal};
#[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
pub enum ContextoidType<D, S, T, ST>
where
D: Datable,
S: Spatial,
T: Temporal,
ST: SpaceTemporal,
{
Datoid(D),
Tempoid(T),
Root(Root),
Spaceoid(S),
SpaceTempoid(ST),
}
impl<D, S, T, ST> ContextoidType<D, S, T, ST>
where
D: Datable,
S: Spatial,
T: Temporal,
ST: SpaceTemporal,
{
pub fn root(&self) -> Option<&Root> {
if let ContextoidType::Root(b) = self {
Some(b)
} else {
None
}
}
pub fn dataoid(&self) -> Option<&D> {
if let ContextoidType::Datoid(b) = self {
Some(b)
} else {
None
}
}
pub fn tempoid(&self) -> Option<&T> {
if let ContextoidType::Tempoid(b) = self {
Some(b)
} else {
None
}
}
pub fn spaceiod(&self) -> Option<&S> {
if let ContextoidType::Spaceoid(b) = self {
Some(b)
} else {
None
}
}
pub fn space_tempoid(&self) -> Option<&ST> {
if let ContextoidType::SpaceTempoid(b) = self {
Some(b)
} else {
None
}
}
}
impl<D, S, T, ST> Display for ContextoidType<D, S, T, ST>
where
D: Datable + Display,
S: Spatial + Display,
T: Temporal + Display,
ST: SpaceTemporal + Display,
{
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
ContextoidType::Datoid(b) => write!(f, "Datoid: {}", b),
ContextoidType::Tempoid(b) => write!(f, "Tempoid: {}", b),
ContextoidType::Root(b) => write!(f, "Root: {}", b),
ContextoidType::Spaceoid(b) => write!(f, "Spaceiod: {}", b),
ContextoidType::SpaceTempoid(b) => write!(f, "SpaceTempoid: {}", b),
}
}
}