Skip to main content

panache_parser/parser/yaml/
model.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
2pub enum YamlInputKind {
3    #[default]
4    Plain,
5    Hashpipe,
6}
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub struct ShadowYamlOptions {
10    pub enabled: bool,
11    pub input_kind: YamlInputKind,
12}
13
14impl Default for ShadowYamlOptions {
15    fn default() -> Self {
16        Self {
17            enabled: false,
18            input_kind: YamlInputKind::Plain,
19        }
20    }
21}
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq)]
24pub enum ShadowYamlOutcome {
25    SkippedDisabled,
26    PrototypeParsed,
27    PrototypeRejected,
28}
29
30#[derive(Debug, Clone, PartialEq, Eq)]
31pub struct ShadowYamlReport {
32    pub outcome: ShadowYamlOutcome,
33    pub shadow_reason: &'static str,
34    pub input_kind: YamlInputKind,
35    pub input_len_bytes: usize,
36    pub line_count: usize,
37    pub normalized_input: Option<String>,
38}
39
40#[derive(Debug, Clone, PartialEq, Eq)]
41pub struct YamlDiagnostic {
42    pub code: &'static str,
43    pub message: &'static str,
44    pub byte_start: usize,
45    pub byte_end: usize,
46}
47
48#[derive(Debug, Clone)]
49pub struct YamlParseReport {
50    pub tree: Option<crate::syntax::SyntaxNode>,
51    pub diagnostics: Vec<YamlDiagnostic>,
52}
53
54pub mod diagnostic_codes {
55    pub const LEX_ERROR: &str = "YAML_LEX_ERROR";
56    pub const LEX_TRAILING_CONTENT_AFTER_DOCUMENT_START: &str =
57        "YAML_LEX_TRAILING_CONTENT_AFTER_DOCUMENT_START";
58    pub const LEX_TRAILING_CONTENT_AFTER_DOCUMENT_END: &str =
59        "YAML_LEX_TRAILING_CONTENT_AFTER_DOCUMENT_END";
60    pub const LEX_INVALID_DOUBLE_QUOTED_ESCAPE: &str = "YAML_LEX_INVALID_DOUBLE_QUOTED_ESCAPE";
61    pub const LEX_WRONG_INDENTED_FLOW: &str = "YAML_LEX_WRONG_INDENTED_FLOW";
62
63    pub const PARSE_EXPECTED_FLOW_SEQUENCE_START: &str = "YAML_PARSE_EXPECTED_FLOW_SEQUENCE_START";
64    pub const PARSE_TRAILING_CONTENT_AFTER_FLOW_END: &str =
65        "YAML_PARSE_TRAILING_CONTENT_AFTER_FLOW_END";
66    pub const PARSE_INVALID_FLOW_SEQUENCE_COMMA: &str = "YAML_PARSE_INVALID_FLOW_SEQUENCE_COMMA";
67    pub const PARSE_UNTERMINATED_FLOW_SEQUENCE: &str = "YAML_PARSE_UNTERMINATED_FLOW_SEQUENCE";
68    pub const PARSE_EXPECTED_FLOW_MAP_START: &str = "YAML_PARSE_EXPECTED_FLOW_MAP_START";
69    pub const PARSE_UNTERMINATED_FLOW_MAP: &str = "YAML_PARSE_UNTERMINATED_FLOW_MAP";
70    pub const PARSE_UNEXPECTED_FLOW_CLOSER: &str = "YAML_PARSE_UNEXPECTED_FLOW_CLOSER";
71    pub const PARSE_UNEXPECTED_INDENT: &str = "YAML_PARSE_UNEXPECTED_INDENT";
72    pub const PARSE_UNEXPECTED_DEDENT: &str = "YAML_PARSE_UNEXPECTED_DEDENT";
73    pub const PARSE_INVALID_KEY_TOKEN: &str = "YAML_PARSE_INVALID_KEY_TOKEN";
74    pub const PARSE_MISSING_COLON: &str = "YAML_PARSE_MISSING_COLON";
75    pub const PARSE_UNTERMINATED_BLOCK_MAP: &str = "YAML_PARSE_UNTERMINATED_BLOCK_MAP";
76    pub const PARSE_DIRECTIVE_AFTER_CONTENT: &str = "YAML_PARSE_DIRECTIVE_AFTER_CONTENT";
77    pub const PARSE_DIRECTIVE_WITHOUT_DOCUMENT_START: &str =
78        "YAML_PARSE_DIRECTIVE_WITHOUT_DOCUMENT_START";
79}
80
81#[derive(Debug, Clone, Copy, PartialEq, Eq)]
82pub enum YamlToken {
83    Indent,
84    Dedent,
85    DocumentStart,
86    DocumentEnd,
87    Directive,
88    Anchor,
89    Alias,
90    Key,
91    Colon,
92    FlowMapStart,
93    FlowMapEnd,
94    FlowSeqStart,
95    FlowSeqEnd,
96    Comma,
97    Whitespace,
98    Tag,
99    BlockScalarHeader,
100    BlockScalarContent,
101    BlockSeqEntry,
102    Scalar,
103    Comment,
104    Newline,
105}
106
107#[derive(Debug, Clone, Copy, PartialEq, Eq)]
108pub struct YamlTokenSpan<'a> {
109    pub kind: YamlToken,
110    pub text: &'a str,
111    pub byte_start: usize,
112    pub byte_end: usize,
113}
114
115impl<'a> YamlTokenSpan<'a> {
116    pub fn new(kind: YamlToken, text: &'a str) -> Self {
117        Self {
118            kind,
119            text,
120            byte_start: 0,
121            byte_end: 0,
122        }
123    }
124}