use schemars::JsonSchema;
use serde::{Deserialize, Deserializer};
use super::form::{Presets, preset_or, presets};
#[derive(Clone, Copy, PartialEq, Debug, Default, Deserialize, JsonSchema)]
#[serde(remote = "Self", rename_all = "camelCase", deny_unknown_fields)]
#[schemars(transform = presets::<Layout>)]
pub enum Layout {
#[default]
None,
Stress(Stress),
Layered(Layered),
}
impl Presets for Layout {
const NAMES: &'static [&'static str] = &["none", "stress", "layered"];
fn preset(name: &str) -> Option<Layout> {
match name {
"none" => Some(Layout::None),
"stress" => Some(Layout::Stress(Stress::default())),
"layered" => Some(Layout::Layered(Layered::default())),
_ => None,
}
}
fn options<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<Layout, D::Error> {
Layout::deserialize(deserializer)
}
}
impl<'de> Deserialize<'de> for Layout {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Layout, D::Error> {
preset_or(deserializer)
}
}
#[derive(Clone, Copy, PartialEq, Debug, Deserialize, JsonSchema)]
#[serde(default, rename_all = "camelCase", deny_unknown_fields)]
pub struct Stress {
#[schemars(range(min = 0))]
pub gap: f64,
}
impl Default for Stress {
fn default() -> Stress {
Stress { gap: 40.0 }
}
}
#[derive(Clone, Copy, PartialEq, Debug, Deserialize, JsonSchema)]
#[serde(default, rename_all = "camelCase", deny_unknown_fields)]
pub struct Layered {
pub flow: Direction,
pub gap: f64,
pub rank_gap: f64,
}
impl Default for Layered {
fn default() -> Layered {
Layered { flow: Direction::Right, gap: 30.0, rank_gap: 80.0 }
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub enum Route {
Straight,
Geodesic,
Orthogonal,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub enum Interpolation {
#[default]
Linear,
StepBefore,
StepAfter,
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Default, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub enum Direction {
#[default]
Right,
Left,
Down,
Up,
}
impl From<Stress> for Layout {
fn from(stress: Stress) -> Layout {
Layout::Stress(stress)
}
}
impl From<Layered> for Layout {
fn from(layered: Layered) -> Layout {
Layout::Layered(layered)
}
}