Skip to content

Commit 7056566

Browse files
add maps and flat modifier
Signed-off-by: Valentyn Faychuk <valy@faychuk.com>
1 parent 3b6a195 commit 7056566

6 files changed

Lines changed: 308 additions & 57 deletions

File tree

contract_samples/rust/examples/counter_macros.rs

Lines changed: 0 additions & 43 deletions
This file was deleted.
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#![no_std]
2+
#![no_main]
3+
4+
extern crate alloc;
5+
use alloc::vec::Vec;
6+
use alloc::string::{String, ToString};
7+
use amadeus_sdk::*;
8+
9+
#[contract_state]
10+
struct Match {
11+
#[flat] score: u16,
12+
#[flat] opponent: String,
13+
}
14+
15+
#[contract_state]
16+
struct TournamentInfo {
17+
#[flat] name: String,
18+
#[flat] prize_pool: u64,
19+
}
20+
21+
#[contract_state]
22+
struct Leaderboard {
23+
#[flat] total_matches: i32,
24+
player_wins: Map<String, u32>,
25+
players: MapNested<String, MapNested<u64, Match>>,
26+
tournament: TournamentInfo,
27+
}
28+
29+
#[contract]
30+
impl Leaderboard {
31+
pub fn increment_total_matches(&mut self) {
32+
*self.total_matches += 1;
33+
}
34+
35+
pub fn get_total_matches(&mut self) -> Vec<u8> {
36+
(*self.total_matches).to_string().into_bytes()
37+
}
38+
39+
pub fn record_match(&mut self, player: String, match_id: Vec<u8>, score: Vec<u8>, opponent: String) {
40+
let match_id_u64 = u64::from_bytes(match_id);
41+
self.players.with_mut(player, |matches| {
42+
matches.with_mut(match_id_u64, |m| {
43+
*m.score = u16::from_bytes(score);
44+
*m.opponent = opponent;
45+
});
46+
});
47+
*self.total_matches += 1;
48+
}
49+
50+
pub fn get_match_score(&mut self, player: String, match_id: Vec<u8>) -> Vec<u8> {
51+
let match_id_u64 = u64::from_bytes(match_id);
52+
self.players.with_mut(player, |matches| {
53+
matches.with_mut(match_id_u64, |m| {
54+
(*m.score).to_string().into_bytes()
55+
})
56+
})
57+
}
58+
59+
pub fn get_match_opponent(&mut self, player: String, match_id: Vec<u8>) -> String {
60+
let match_id_u64 = u64::from_bytes(match_id);
61+
self.players.with_mut(player, |matches| {
62+
matches.with_mut(match_id_u64, |m| {
63+
(*m.opponent).clone()
64+
})
65+
})
66+
}
67+
68+
pub fn set_tournament_info(&mut self, name: String, prize_pool: Vec<u8>) {
69+
*self.tournament.name = name;
70+
*self.tournament.prize_pool = u64::from_bytes(prize_pool);
71+
}
72+
73+
pub fn get_tournament_name(&mut self) -> String {
74+
(*self.tournament.name).clone()
75+
}
76+
77+
pub fn get_tournament_prize(&mut self) -> Vec<u8> {
78+
(*self.tournament.prize_pool).to_string().into_bytes()
79+
}
80+
81+
pub fn record_win(&mut self, player: String) {
82+
if let Some(wins) = self.player_wins.get_mut(&player) {
83+
**wins += 1;
84+
} else {
85+
self.player_wins.insert(player, 1);
86+
}
87+
}
88+
89+
pub fn get_player_wins(&mut self, player: String) -> Vec<u8> {
90+
if let Some(wins) = self.player_wins.get(&player) {
91+
(*wins).to_string().into_bytes()
92+
} else {
93+
"0".to_string().into_bytes()
94+
}
95+
}
96+
97+
pub fn set_player_wins(&mut self, player: String, wins: Vec<u8>) {
98+
self.player_wins.insert(player, u32::from_bytes(wins));
99+
}
100+
}

contract_samples/rust/sdk-macros/src/lib.rs

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,45 @@ pub fn contract_state(_attr: TokenStream, item: TokenStream) -> TokenStream {
1313
return TokenStream::from(quote! { #input });
1414
};
1515

16-
let is_nested = |f: &syn::Field| -> bool {
17-
f.attrs.iter().any(|attr| attr.path().is_ident("nested"))
16+
let is_flat = |f: &syn::Field| -> bool {
17+
f.attrs.iter().any(|attr| attr.path().is_ident("flat"))
18+
};
19+
20+
let is_map = |f: &syn::Field| -> bool {
21+
if let Type::Path(type_path) = &f.ty {
22+
if let Some(segment) = type_path.path.segments.first() {
23+
return segment.ident == "Map";
24+
}
25+
}
26+
false
27+
};
28+
29+
let is_map_nested = |f: &syn::Field| -> bool {
30+
if let Type::Path(type_path) = &f.ty {
31+
if let Some(segment) = type_path.path.segments.first() {
32+
return segment.ident == "MapNested";
33+
}
34+
}
35+
false
1836
};
1937

2038
let transformed_fields = fields.named.iter().map(|f| {
2139
let field_name = &f.ident;
2240
let field_vis = &f.vis;
2341
let field_ty = &f.ty;
2442
let filtered_attrs: Vec<_> = f.attrs.iter()
25-
.filter(|attr| !attr.path().is_ident("nested"))
43+
.filter(|attr| !attr.path().is_ident("flat"))
2644
.collect();
2745

28-
if is_nested(f) {
46+
if is_flat(f) {
2947
quote! {
3048
#(#filtered_attrs)*
31-
#field_vis #field_name: #field_ty
49+
#field_vis #field_name: LazyCell<#field_ty>
3250
}
3351
} else {
3452
quote! {
3553
#(#filtered_attrs)*
36-
#field_vis #field_name: LazyCell<#field_ty>
54+
#field_vis #field_name: #field_ty
3755
}
3856
}
3957
});
@@ -42,29 +60,35 @@ pub fn contract_state(_attr: TokenStream, item: TokenStream) -> TokenStream {
4260
let field = f.ident.as_ref().unwrap();
4361
let key = field.to_string();
4462

45-
if is_nested(f) {
63+
if is_flat(f) {
64+
quote! {
65+
let mut key = prefix.clone();
66+
key.extend_from_slice(#key.as_bytes());
67+
self.#field = LazyCell::new(key);
68+
}
69+
} else if is_map(f) || is_map_nested(f) {
4670
quote! {
4771
let mut key = prefix.clone();
4872
key.extend_from_slice(#key.as_bytes());
49-
key.push(b':');
5073
self.#field.__init_lazy_fields(key);
5174
}
5275
} else {
5376
quote! {
5477
let mut key = prefix.clone();
5578
key.extend_from_slice(#key.as_bytes());
56-
self.#field = LazyCell::new(key);
79+
key.push(b':');
80+
self.#field.__init_lazy_fields(key);
5781
}
5882
}
5983
});
6084

6185
let flush_calls = fields.named.iter().map(|f| {
6286
let field = f.ident.as_ref().unwrap();
6387

64-
if is_nested(f) {
65-
quote! { self.#field.__flush_lazy_fields(); }
66-
} else {
88+
if is_flat(f) {
6789
quote! { self.#field.flush(); }
90+
} else {
91+
quote! { self.#field.__flush_lazy_fields(); }
6892
}
6993
});
7094

contract_samples/rust/sdk/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,5 @@ name = "nft"
3434
path = "../examples/nft.rs"
3535

3636
[[example]]
37-
name = "counter_macros"
38-
path = "../examples/counter_macros.rs"
37+
name = "showcase"
38+
path = "../examples/showcase.rs"

0 commit comments

Comments
 (0)