Skip to main content

ocelot_ast/
script.rs

1use crate::item::Item;
2use crate::item_kind::ItemKind;
3use crate::statement::Statement;
4use ocelot_base::span::Span;
5
6/// Root syntax node for a script-like `ocelot` source file.
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct Script {
9    pub items: Vec<Item>,
10    pub span: Span,
11}
12
13impl Script {
14    /// Creates a script from its items and source span.
15    pub fn new(items: Vec<Item>, span: Span) -> Self {
16        Self { items, span }
17    }
18
19    /// Returns executable top-level statements in source order.
20    pub fn statements(&self) -> impl Iterator<Item = &Statement> {
21        self.items.iter().filter_map(|item| match &item.kind {
22            ItemKind::Statement(statement) => Some(statement),
23            ItemKind::Test(_) => None,
24        })
25    }
26}
27
28impl Default for Script {
29    fn default() -> Self {
30        Self::new(Vec::new(), Span::default())
31    }
32}