pub use crate::{
psp34,
psp34::{
balances,
extensions::metadata,
},
traits::psp34::{
extensions::metadata::*,
*,
},
};
pub use metadata::Internal as _;
pub use psp34::{
Internal as _,
Transfer as _,
};
use openbrush::{
storage::{
Mapping,
TypeGuard,
},
traits::{
Storage,
String,
},
};
pub const STORAGE_KEY: u32 = openbrush::storage_unique_key!(Data);
#[derive(Default, Debug)]
#[openbrush::upgradeable_storage(STORAGE_KEY)]
pub struct Data {
pub attributes: Mapping<(Id, String), String, AttributesKey>,
pub _reserved: Option<()>,
}
pub struct AttributesKey;
impl<'a> TypeGuard<'a> for AttributesKey {
type Type = &'a (&'a Id, &'a String);
}
impl<T: Storage<Data>> PSP34Metadata for T {
default fn get_attribute(&self, id: Id, key: String) -> Option<String> {
self.data().attributes.get(&(&id, &key))
}
}
pub trait Internal {
fn _emit_attribute_set_event(&self, _id: Id, _key: String, _data: String);
fn _set_attribute(&mut self, id: Id, key: String, value: String);
}
impl<T> Internal for T
where
T: Storage<Data>,
{
default fn _emit_attribute_set_event(&self, _id: Id, _key: String, _data: String) {}
default fn _set_attribute(&mut self, id: Id, key: String, value: String) {
self.data().attributes.insert(&(&id, &key), &value);
self._emit_attribute_set_event(id, key, value);
}
}