use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Vocab {
pub version: String,
pub language: LanguageVocab,
pub stdlib: StdlibVocab,
pub diagnostics: DiagnosticsVocab,
pub tooling: ToolingVocab,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct LanguageVocab {
pub keywords: Vec<Keyword>,
pub operators: Vec<Operator>,
pub annotations: Vec<Annotation>,
pub strictness_levels: Vec<StrictnessLevel>,
pub primitive_types: Vec<PrimitiveType>,
pub prelude_types: Vec<Symbol>,
pub prelude_functions: Vec<Symbol>,
pub prelude_traits: Vec<Symbol>,
pub prelude_constructors: Vec<Symbol>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Keyword {
pub name: String,
pub category: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub spec_ref: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Operator {
pub symbol: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub precedence: Option<u8>,
pub associativity: String,
pub kind: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub spec_ref: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Annotation {
pub name: String,
pub params: String,
pub purpose: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub spec_ref: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct StrictnessLevel {
pub name: String,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub spec_ref: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PrimitiveType {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub spec_ref: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Symbol {
pub name: String,
pub kind: String,
pub signature: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub doc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spec_ref: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub since: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct StdlibVocab {
pub modules: Vec<Module>,
pub builtin_methods: Vec<BuiltinMethodGroup>,
pub builtin_globals: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Module {
pub path: String,
pub types: Vec<Symbol>,
pub functions: Vec<Symbol>,
pub effects: Vec<Symbol>,
pub traits: Vec<Symbol>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spec_ref: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct BuiltinMethodGroup {
pub receiver: String,
pub methods: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiagnosticsVocab {
pub codes: Vec<DiagnosticCode>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiagnosticCode {
pub code: String,
pub severity: String,
pub summary: String,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub bad_example: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub good_example: Option<String>,
pub spec_refs: Vec<String>,
pub related_codes: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ToolingVocab {
pub targets: Vec<Target>,
pub ai_providers: Vec<String>,
pub commands: Vec<Command>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Target {
pub id: String,
pub display_name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Command {
pub name: String,
pub summary: String,
}