use std::fmt;
use serde::{Serialize, Serializer};
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum GraphCollection {
Node,
Reference,
Edge,
}
impl GraphCollection {
fn token(self) -> &'static str {
match self {
Self::Node => "node",
Self::Reference => "reference",
Self::Edge => "edge",
}
}
}
impl fmt::Display for GraphCollection {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str(self.token())
}
}
impl Serialize for GraphCollection {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_str(self.token())
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct GraphLimits {
max_nodes: u32,
max_references: u32,
max_edges: u32,
}
impl Default for GraphLimits {
fn default() -> Self {
Self {
max_nodes: u32::MAX,
max_references: u32::MAX,
max_edges: u32::MAX,
}
}
}
impl GraphLimits {
pub fn new(max_nodes: u32, max_references: u32, max_edges: u32) -> Self {
Self {
max_nodes,
max_references,
max_edges,
}
}
pub fn max_nodes(&self) -> u32 {
self.max_nodes
}
pub fn max_references(&self) -> u32 {
self.max_references
}
pub fn max_edges(&self) -> u32 {
self.max_edges
}
pub(crate) fn ceiling(&self, collection: GraphCollection) -> u32 {
match collection {
GraphCollection::Node => self.max_nodes,
GraphCollection::Reference => self.max_references,
GraphCollection::Edge => self.max_edges,
}
}
}