sway_parse/item/
item_storage.rs

1use crate::{Parse, ParseResult, Parser};
2
3use sway_ast::{
4    attribute::Annotated,
5    keywords::{ColonToken, InToken},
6    Braces, CommaToken, Expr, ItemStorage, Punctuated, StorageEntry, StorageField,
7};
8use sway_types::BaseIdent;
9
10impl Parse for StorageEntry {
11    fn parse(parser: &mut Parser) -> ParseResult<StorageEntry> {
12        let name: BaseIdent = parser.parse()?;
13        let mut field = None;
14        let mut namespace = None;
15        if parser.peek::<ColonToken>().is_some() || parser.peek::<InToken>().is_some() {
16            let mut f: StorageField = parser.parse()?;
17            f.name = name.clone();
18            field = Some(f);
19        } else {
20            let n: Braces<Punctuated<Annotated<Box<StorageEntry>>, CommaToken>> = parser.parse()?;
21            namespace = Some(n);
22        }
23        Ok(StorageEntry {
24            name,
25            namespace,
26            field,
27        })
28    }
29}
30
31impl Parse for StorageField {
32    fn parse(parser: &mut Parser) -> ParseResult<StorageField> {
33        let name = BaseIdent::dummy(); // Name will be overridden in StorageEntry parse.
34        let in_token: Option<InToken> = parser.take();
35        let mut key_opt: Option<Expr> = None;
36        if in_token.is_some() {
37            key_opt = Some(parser.parse()?);
38        }
39        let colon_token = parser.parse()?;
40        let ty = parser.parse()?;
41        let eq_token = parser.parse()?;
42        let initializer = parser.parse()?;
43        Ok(StorageField {
44            name,
45            in_token,
46            key_expr: key_opt,
47            colon_token,
48            ty,
49            eq_token,
50            initializer,
51        })
52    }
53}
54
55impl Parse for ItemStorage {
56    fn parse(parser: &mut Parser) -> ParseResult<ItemStorage> {
57        let storage_token = parser.parse()?;
58        let entries = parser.parse()?;
59        Ok(ItemStorage {
60            storage_token,
61            entries,
62        })
63    }
64}