lunarity_ast/
source.rs

1use {*};
2
3/// A `SourceUnit` is the top level construct of the grammar.
4#[derive(Clone, Copy, Debug, PartialEq)]
5pub enum SourceUnit<'ast> {
6    PragmaDirective(PragmaDirective<'ast>),
7    ImportDirective(ImportDirective<'ast>),
8    ContractDefinition(ContractDefinition<'ast>),
9}
10
11#[derive(Clone, Copy, Debug, PartialEq)]
12pub struct PragmaDirective<'ast> {
13    pub version: &'ast str,
14}
15
16#[derive(Clone, Copy, Debug, PartialEq)]
17pub struct Import<'ast> {
18    pub symbol: IdentifierNode<'ast>,
19    pub alias: Option<IdentifierNode<'ast>>,
20}
21
22#[derive(Clone, Copy, Debug, PartialEq)]
23pub enum ImportDirective<'ast> {
24    /// 'import' StringLiteral ('as' Identifier)? ';'
25    Global {
26        source: Node<'ast, StringLiteral<'ast>>,
27        alias: Option<IdentifierNode<'ast>>,
28    },
29
30    /// 'import' ('*' | Identifier) ('as' Identifier)? 'from' StringLiteral ';'
31    From {
32        symbol: Option<IdentifierNode<'ast>>,
33        alias: Option<IdentifierNode<'ast>>,
34        source: Node<'ast, StringLiteral<'ast>>,
35    },
36
37    /// 'import' '{' Identifier ('as' Identifier)? ( ',' Identifier ('as' Identifier)? )* '}' 'from' StringLiteral ';'
38    ManyFrom {
39        imports: NodeList<'ast, Import<'ast>>,
40        source: Node<'ast, StringLiteral<'ast>>,
41    },
42}
43
44impl_from! {
45    PragmaDirective => SourceUnit::PragmaDirective,
46    ImportDirective => SourceUnit::ImportDirective,
47    ContractDefinition => SourceUnit::ContractDefinition,
48}