use crate::attrs::ValueType;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EdgeKindSpec {
pub flow: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttributeGroup {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct Thresholds {
pub info: f64,
pub warning: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttributeSpec {
pub value_type: ValueType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub short: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub formula: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub calc: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub direction: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub abbreviate: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub thresholds: Option<Thresholds>,
}
impl AttributeSpec {
pub fn new(value_type: ValueType, label: &str) -> Self {
Self {
value_type,
label: Some(label.to_string()),
name: None,
short: None,
description: None,
formula: None,
calc: None,
direction: None,
abbreviate: None,
group: None,
thresholds: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NodeKindSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub plural: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fill: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub stroke: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub external: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CycleKindSpec {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Grouping {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub function: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Level {
pub name: String,
pub edge_kinds: BTreeMap<String, EdgeKindSpec>,
pub node_attributes: BTreeMap<String, AttributeSpec>,
pub edge_attributes: BTreeMap<String, AttributeSpec>,
pub attribute_groups: BTreeMap<String, AttributeGroup>,
#[serde(default)]
pub node_kinds: BTreeMap<String, NodeKindSpec>,
#[serde(default)]
pub cycle_kinds: BTreeMap<String, CycleKindSpec>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub grouping: Option<Grouping>,
}