use crate::FileId; #[derive(Debug)] pub struct ParsedFile { pub file_id: FileId, pub nodes: Vec, pub tokens: Vec, pub errors: Vec, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Node { pub range: SourceRange, pub data: NodeData, } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct SourceRange { pub start: usize, pub end: usize, } impl std::fmt::Display for SourceRange { fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(formatter, "{}..{}", self.start, self.end) } } #[derive(Debug, Clone, PartialEq, Eq)] pub enum NodeData { Binding(Binding), LetBlock(LetBlock), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Binding { pub key: Ident, pub value: Expr, pub references: Vec, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct LetBlock { pub bindings: Vec, pub body_references: Vec, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Ident { pub name: String, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Expr { Ident(Ident), Select(Select), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Select { pub receiver: String, pub attr: Ident, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Token { pub range: SourceRange, pub data: TokenData, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum TokenData { UnquotedUri(String), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct ParseError { pub range: SourceRange, pub message: String, }