use crate::{
ast,
utils::duplicate_config_err,
};
#[derive(Debug, PartialEq, Eq)]
pub struct EventConfig {
anonymous: bool,
signature_topic_hex: Option<String>,
}
impl TryFrom<ast::AttributeArgs> for EventConfig {
type Error = syn::Error;
fn try_from(args: ast::AttributeArgs) -> Result<Self, Self::Error> {
let mut anonymous: Option<syn::Path> = None;
let mut signature_topic: Option<syn::LitStr> = None;
for arg in args.into_iter() {
if arg.name().is_ident("anonymous") {
if let Some(lit_bool) = anonymous {
return Err(duplicate_config_err(lit_bool, arg, "anonymous", "event"));
}
if let ast::Meta::Path(path) = arg {
anonymous = Some(path)
} else {
return Err(format_err_spanned!(
arg,
"encountered an unexpected value for `anonymous` ink! event item configuration argument. \
Did you mean #[ink::event(anonymous)] ?",
));
}
} else if arg.name().is_ident("signature_topic") {
if anonymous.is_some() {
return Err(format_err_spanned!(
arg,
"cannot specify `signature_topic` with `anonymous` in ink! event item configuration argument",
));
}
if let Some(lit_str) = signature_topic {
return Err(duplicate_config_err(
lit_str,
arg,
"signature_topic",
"event",
));
}
if let Some(lit_str) = arg.value().and_then(ast::MetaValue::as_lit_string)
{
signature_topic = Some(lit_str.clone())
} else {
return Err(format_err_spanned!(
arg,
"expected a string literal value for `signature_topic` ink! event item configuration argument",
));
}
} else {
return Err(format_err_spanned!(
arg,
"encountered unknown or unsupported ink! event item configuration argument",
));
}
}
Ok(EventConfig::new(
anonymous.is_some(),
signature_topic.map(|lit_str| lit_str.value()),
))
}
}
impl EventConfig {
pub fn new(anonymous: bool, signature_topic_hex: Option<String>) -> Self {
Self {
anonymous,
signature_topic_hex,
}
}
pub fn anonymous(&self) -> bool {
self.anonymous
}
pub fn signature_topic_hex(&self) -> Option<&str> {
self.signature_topic_hex.as_deref()
}
}