use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpecShowResponse {
pub groups: Vec<SpecGroupInfo>,
pub relations: Vec<SpecRelation>,
pub stats: SpecStats,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpecGroupInfo {
pub name: String,
pub specs: Vec<SpecInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpecInfo {
pub alias_name: String,
pub wrapped_type_name: String,
pub source: SpecSourceKind,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SpecSourceKind {
TypeAlias,
Comment,
Inferred,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpecRelation {
pub from: String,
pub to: String,
pub kind: SpecRelationKind,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SpecRelationKind {
DependsOn,
RelatedTo,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpecStats {
pub groups: usize,
pub specs: usize,
pub nodes: usize,
pub edges: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpecLintIssue {
pub severity: LintSeverity,
pub message: String,
pub location: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum LintSeverity {
Warning,
Error,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpecLintResult {
pub issues: Vec<SpecLintIssue>,
pub warnings: usize,
pub errors: usize,
}
impl SpecLintResult {
pub fn has_errors(&self) -> bool {
self.errors > 0
}
pub fn has_issues(&self) -> bool {
!self.issues.is_empty()
}
}