use crate::api::ModuleId;
use crate::types::BlueprintId;
use crate::ScryptoSbor;
use radix_engine_common::address::AddressDisplayContext;
use radix_engine_common::types::NodeId;
use sbor::rust::fmt;
use sbor::rust::string::String;
use utils::ContextualDisplay;
#[derive(Debug, Clone, PartialEq, Eq, Hash, ScryptoSbor)]
pub struct EventTypeIdentifier(pub Emitter, pub String);
#[derive(Debug, Clone, PartialEq, Eq, Hash, ScryptoSbor)]
pub enum Emitter {
Function(BlueprintId),
Method(NodeId, ModuleId),
}
impl<'a> ContextualDisplay<AddressDisplayContext<'a>> for Emitter {
type Error = fmt::Error;
fn contextual_format<F: fmt::Write>(
&self,
f: &mut F,
context: &AddressDisplayContext<'a>,
) -> Result<(), Self::Error> {
match self {
Self::Function(blueprint_id) => {
write!(
f,
"Function {{ blueprint_id: {} }}",
blueprint_id.display(*context),
)
}
Self::Method(node_id, module_id) => {
write!(
f,
"Method {{ node: {}, module_id: {:?} }}",
node_id.display(*context),
module_id,
)
}
}
}
}
impl EventTypeIdentifier {
pub fn len(&self) -> usize {
let emitter_size = match &self.0 {
Emitter::Function(blueprint_id) => blueprint_id.len(),
Emitter::Method(node_id, _module_1) => node_id.len() + 1,
};
emitter_size + self.1.len()
}
}