sway_parse/item/
item_storage.rs1use 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(); 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}