Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automatic accessors macro #61

Merged
merged 24 commits into from
May 31, 2023
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
4ce27c0
initial implementation of getters macro
Artemka374 Apr 12, 2023
048146f
some updates
Artemka374 Apr 13, 2023
a189f4f
add getters
Artemka374 May 5, 2023
7b85f13
fix bug with not compiling OB, compiling but not working for now
varex83 May 15, 2023
e2b838f
fix getters generation
Artemka374 May 16, 2023
242a919
Merge branch 'main' into feature/automatic-getters
Artemka374 May 16, 2023
11923ae
add docs
Artemka374 May 16, 2023
82c6a39
remove unnecesary trait implementations
Artemka374 May 16, 2023
c49acf5
fix warnings and add the getters macro to psp22 example
Artemka374 May 16, 2023
4cd45bc
rename to accessors and add `set` attribute to generate setters
Artemka374 May 17, 2023
5520f21
add necessary code so the tests actuall compile
grandima May 22, 2023
07e06fd
add only_set e2e test
grandima May 22, 2023
ce7e3b4
add get_only e2e test
grandima May 22, 2023
e2a7ceb
create `accessors_attr` folder to demo `accessors` macro
grandima May 23, 2023
8c90917
add more tests to `accessors_attr`;
grandima May 23, 2023
1182cab
rename `HatedLogic` -> `DumbData`
grandima May 23, 2023
0243e16
rename HatedLogic -> HatedStorage
grandima May 23, 2023
47ed286
change from `find` to `any`
grandima May 23, 2023
9538cdc
Merge pull request #66 from Brushfam/grandima/automatic-getters
Artemka374 May 24, 2023
e3f8d8b
Fix doc tests
varex83 May 25, 2023
a25c448
apply suggestions
Artemka374 May 25, 2023
aa5ac3f
Merge branch 'main' into feature/automatic-getters
Artemka374 May 25, 2023
79d800b
apply suggestions
Artemka374 May 29, 2023
f7cc8b9
rename dumb to access
Artemka374 May 31, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion contracts/src/traits/psp22/psp22.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ use openbrush::traits::{
#[openbrush::wrapper]
pub type PSP22Ref = dyn PSP22;

/// Trait implemented by all PSP-20 respecting smart traits.
/// Trait implemented by all PSP-22 respecting smart traits.
#[openbrush::trait_definition]
pub trait PSP22 {
/// Returns the total token supply.
Expand Down
39 changes: 39 additions & 0 deletions examples/accessors_attr/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
[package]
name = "accessors_attr"
version = "3.1.1"
authors = ["Brushfam <green@727.ventures>"]
edition = "2021"

[dependencies]
ink = { version = "4.2.0", default-features = false}

scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] }
scale-info = { version = "2.3", default-features = false, features = ["derive"], optional = true }

openbrush = { path = "../..", default-features = false }

[dev-dependencies]
ink_e2e = "4.2"
test_helpers = { path = "../test_helpers", default-features = false }

[lib]
name = "accessors_attr"
path = "lib.rs"
crate-type = [
# Used for normal contract Wasm blobs.
"cdylib",
]

[features]
default = ["std"]
std = [
"ink/std",
"scale/std",
"scale-info/std",
"openbrush/std",
]
ink-as-dependency = []
e2e-tests = []

[profile.dev]
codegen-units = 16
207 changes: 207 additions & 0 deletions examples/accessors_attr/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
#![cfg_attr(not(feature = "std"), no_std)]
#![feature(min_specialization)]

pub use accessors_attr::*;

#[openbrush::contract]
pub mod accessors_attr {
use openbrush::{
traits::{
Storage,
},
};

#[ink(storage)]
#[derive(Storage)]
pub struct Contract {
// fields for hater logic
#[storage_field]
hated_logic: DumbData,
}

#[openbrush::upgradeable_storage(STORAGE_KEY)]
#[openbrush::accessors(DumbDataAccessors)]
#[derive(Storage)]
#[derive(Debug)]
pub struct DumbData {
#[get]
#[set]
dumb_g_s: u32,
#[get]
dumb_g_only: u32,
#[set]
dumb_s_only: u32,
}

pub const STORAGE_KEY: u32 = openbrush::storage_unique_key!(DumbData);

impl DumbDataAccessors for Contract {}

impl Contract {
#[ink(constructor)]
pub fn new() -> Self {
let instance = Self {
hated_logic: DumbData {
dumb_g_s: 0,
dumb_g_only: 0,
dumb_s_only: 0
},
};
instance
}
#[ink(message)]
pub fn update_dumb_g(&mut self, value: u32) {
self.hated_logic.dumb_g_only = value
}
#[ink(message)]
pub fn return_dumb_s(&self) -> u32 {
self.hated_logic.dumb_s_only
}
}

#[cfg(all(test, feature = "e2e-tests"))]
pub mod tests {
use crate::accessors_attr::dumbdataaccessors_external::DumbDataAccessors;
#[rustfmt::skip]
use super::*;
#[rustfmt::skip]
use ink_e2e::{build_message};

type E2EResult<T> = Result<T, Box<dyn std::error::Error>>;

#[ink_e2e::test]
async fn get_and_set() -> E2EResult<()> {
let constructor = ContractRef::new();
let address = client
.instantiate("accessors_attr", &ink_e2e::alice(), constructor, 0, None)
.await
.expect("instantiate failed")
.account_id;

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.get_dumb_g_s());
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("get_dumb_g_s failed")
};

assert!(matches!(result.return_value(), 0));

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.set_dumb_g_s(10));
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("update_dumb_g_only failed")
};

assert!(matches!(result.return_value(), ()));

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.get_dumb_g_s());
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("get_dumb_g_only failed")
};

assert!(matches!(result.return_value(), 10));

Ok(())
}

#[ink_e2e::test]
async fn only_set() -> E2EResult<()> {
let constructor = ContractRef::new();
let address = client
.instantiate("accessors_attr", &ink_e2e::alice(), constructor, 0, None)
.await
.expect("instantiate failed")
.account_id;

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.return_dumb_s());
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("return_dumb_s failed")
};

assert!(matches!(result.return_value(), 0));

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.set_dumb_s_only(10));
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("set_dumb_s_only failed")
};

assert!(matches!(result.return_value(), ()));

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.return_dumb_s());
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("return_dumb_s failed")
};

assert!(matches!(result.return_value(), 10));

Ok(())
}

#[ink_e2e::test]
async fn only_get() -> E2EResult<()> {
let constructor = ContractRef::new();
let address = client
.instantiate("accessors_attr", &ink_e2e::alice(), constructor, 0, None)
.await
.expect("instantiate failed")
.account_id;

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.get_dumb_g_only());
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("get_dumb_g_only failed")
};

assert!(matches!(result.return_value(), 0));

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.update_dumb_g(10));
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("update_dumb_g_only failed")
};

assert!(matches!(result.return_value(), ()));

let result = {
let _msg = build_message::<ContractRef>(address.clone())
.call(|contract| contract.get_dumb_g_only());
client
.call(&ink_e2e::alice(), _msg, 0, None)
.await
.expect("get_dumb_g_only failed")
};

assert!(matches!(result.return_value(), 10));

Ok(())
}
}
}
Loading