use serde::{Deserialize, Serialize};
use crate::graph::Shape;
#[non_exhaustive]
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ViewSpec {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub statements: Vec<ViewStatement>,
#[serde(default)]
pub layout: LayoutMode,
#[serde(default)]
pub boundary: BoundaryPolicy,
#[serde(default)]
pub compound: CompoundPolicy,
}
impl ViewSpec {
pub fn new(statements: Vec<ViewStatement>) -> Self {
Self {
statements,
..Self::default()
}
}
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum ViewStatement {
Include(Selector),
Exclude(Selector),
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum Selector {
All,
Anchor(AnchorRef),
Traversal {
anchor: AnchorRef,
direction: TraversalDirection,
hops: u32,
},
Predicate(NodePredicate),
SubgraphDescendants(String),
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum AnchorRef {
Node(String),
Subgraph(String),
Edge(EdgeAnchor),
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EdgeAnchor {
pub source: String,
pub target: String,
pub ordinal: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum TraversalDirection {
Upstream,
Downstream,
Neighbors,
}
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum NodePredicate {
Shape(Shape),
Parent(String),
Tag(String),
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum LayoutMode {
#[default]
SharedCoordinates,
Compact,
LocalReflow,
Incremental,
}
#[non_exhaustive]
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum BoundaryPolicy {
#[default]
Omit,
Stub {
aggregate_threshold: u32,
},
}
#[non_exhaustive]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum CompoundPolicy {
#[default]
Preserve,
Flatten,
}