use super::{EngineAlgorithmCapabilities, EngineAlgorithmId, LayoutConfig};
use crate::engines::graph::algorithms::layered::MeasurementMode;
use crate::errors::RenderError;
use crate::format::RoutingStyle;
use crate::graph::GeometryLevel;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum EngineConfig {
Layered(crate::engines::graph::algorithms::layered::LayoutConfig),
}
impl From<LayoutConfig> for EngineConfig {
fn from(config: LayoutConfig) -> Self {
EngineConfig::Layered(config.into())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum SubgraphDirectionPolicy {
#[default]
AlternateAxes,
Preserve,
}
#[derive(Debug, Clone)]
pub struct GraphSolveRequest {
pub measurement_mode: MeasurementMode,
pub geometry_contract: GraphGeometryContract,
pub geometry_level: GeometryLevel,
pub routing_style: Option<RoutingStyle>,
pub subgraph_direction_policy: SubgraphDirectionPolicy,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum GraphGeometryContract {
Canonical,
Visual,
}
impl GraphSolveRequest {
pub fn new(
measurement_mode: MeasurementMode,
geometry_contract: GraphGeometryContract,
geometry_level: GeometryLevel,
routing_style: Option<RoutingStyle>,
subgraph_direction_policy: SubgraphDirectionPolicy,
) -> Self {
Self {
measurement_mode,
geometry_contract,
geometry_level,
routing_style,
subgraph_direction_policy,
}
}
}
pub struct GraphSolveResult {
pub engine_id: EngineAlgorithmId,
pub geometry: crate::graph::geometry::GraphGeometry,
pub routed: Option<crate::graph::geometry::RoutedGraphGeometry>,
}
pub trait GraphEngine: Send + Sync {
fn id(&self) -> EngineAlgorithmId;
#[allow(dead_code)]
fn capabilities(&self) -> EngineAlgorithmCapabilities {
self.id().capabilities()
}
fn solve(
&self,
diagram: &crate::graph::Graph,
config: &EngineConfig,
request: &GraphSolveRequest,
) -> Result<GraphSolveResult, RenderError>;
}