1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct SpecShowResponse {
8 pub groups: Vec<SpecGroupInfo>,
10 pub relations: Vec<SpecRelation>,
12 pub stats: SpecStats,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct SpecGroupInfo {
19 pub name: String,
21 pub specs: Vec<SpecInfo>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct SpecInfo {
28 pub alias_name: String,
30 pub wrapped_type_name: String,
32 pub source: SpecSourceKind,
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
38#[serde(rename_all = "snake_case")]
39pub enum SpecSourceKind {
40 TypeAlias,
42 Comment,
44 Inferred,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
50pub struct SpecRelation {
51 pub from: String,
53 pub to: String,
55 pub kind: SpecRelationKind,
57}
58
59#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
61#[serde(rename_all = "snake_case")]
62pub enum SpecRelationKind {
63 DependsOn,
65 RelatedTo,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct SpecStats {
72 pub groups: usize,
74 pub specs: usize,
76 pub nodes: usize,
78 pub edges: usize,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct SpecLintIssue {
85 pub severity: LintSeverity,
87 pub message: String,
89 pub location: Option<String>,
91}
92
93#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
95#[serde(rename_all = "snake_case")]
96pub enum LintSeverity {
97 Warning,
99 Error,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct SpecLintResult {
106 pub issues: Vec<SpecLintIssue>,
108 pub warnings: usize,
110 pub errors: usize,
112}
113
114impl SpecLintResult {
115 pub fn has_errors(&self) -> bool {
117 self.errors > 0
118 }
119
120 pub fn has_issues(&self) -> bool {
122 !self.issues.is_empty()
123 }
124}