pub use crate::{
psp37,
psp37::{
balances,
extensions::metadata,
},
traits::psp37::{
extensions::metadata::*,
*,
},
};
pub use metadata::Internal as _;
use openbrush::{
storage::{
Mapping,
TypeGuard,
},
traits::{
Storage,
String,
},
};
pub use psp37::{
Internal as _,
Transfer as _,
};
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>> PSP37Metadata 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, data: &String) -> Result<(), PSP37Error>;
fn _get_attribute(&self, id: &Id, key: &String) -> Option<String>;
}
impl<T: Storage<Data>> Internal for T {
default fn _emit_attribute_set_event(&self, _id: &Id, _key: &String, _data: &String) {}
default fn _set_attribute(&mut self, id: &Id, key: &String, data: &String) -> Result<(), PSP37Error> {
self.data().attributes.insert(&(&id, &key), data);
self._emit_attribute_set_event(id, key, data);
Ok(())
}
default fn _get_attribute(&self, id: &Id, key: &String) -> Option<String> {
self.data().attributes.get(&(&id, &key))
}
}