use crate::FileId; #[derive(Debug)] pub struct ParsedFile { pub file_id: FileId, pub root: Expr, 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), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Binding { pub range: SourceRange, pub key: Ident, pub value: Expr, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Ident { pub name: String, } #[derive(Debug, Clone, PartialEq, Eq)] pub enum Expr { Ident(Ident), Select(Select), Apply(Apply), Let { range: SourceRange, bindings: Vec, body: Box, }, AttrSet(Vec), Lambda { parameters: Vec, body: Box, }, Other(Vec), } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Select { pub receiver: String, pub attr: Ident, } #[derive(Debug, Clone, PartialEq, Eq)] pub struct Apply { pub lambda: Box, pub argument: Box, } #[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, }