use super::{IsInkFn, IsInkStruct};
use crate::tree::{ast_ext, utils};
use crate::{EnvArg, Environment, InkArg, InkArgKind, InkEntity, Selector, SelectorArg, Topic};
#[allow(unused_imports)]
pub trait IsInkCallable: IsInkFn {
impl_ink_arg_getter!(default_arg, Default, default);
impl_ink_arg_getter!(payable_arg, Payable, payable);
impl_ink_arg_getter!(name_arg, Name, name);
fn selector_arg(&self) -> Option<SelectorArg> {
utils::ink_arg_by_kind(self.syntax(), InkArgKind::Selector).and_then(SelectorArg::cast)
}
fn composed_selector(&self) -> Option<Selector>
where
Self: Sized,
{
Selector::compose(self)
}
}
#[allow(unused_imports)]
pub trait IsInkEvent: IsInkStruct {
impl_ink_arg_getter!(anonymous_arg, Anonymous, anonymous);
impl_ink_arg_getter!(signature_arg, SignatureTopic, signature_topic);
fn topics(&self) -> &[Topic];
}
pub trait HasInkEnvironment: InkEntity {
const ENV_ARG_KIND: InkArgKind;
fn env_arg(&self) -> Option<EnvArg> {
utils::ink_arg_by_kind(self.syntax(), Self::ENV_ARG_KIND).and_then(EnvArg::cast)
}
fn environment(&self) -> Option<Environment> {
self.env_arg()
.as_ref()
.and_then(EnvArg::as_path_with_inaccurate_text_range)
.and_then(|path| ast_ext::resolve_item(&path, self.syntax()))
.map(Environment::new)
}
}
#[allow(unused_imports)]
pub trait IsChainExtensionFn: IsInkFn {
const ID_ARG_KIND: InkArgKind;
fn id<T>(&self) -> Option<T>
where
T: IsIntId,
{
self.id_arg()?.value()?.as_int()
}
fn id_arg(&self) -> Option<InkArg> {
utils::ink_arg_by_kind(self.syntax(), Self::ID_ARG_KIND)
}
impl_ink_arg_getter!(handle_status_arg, HandleStatus, handle_status);
}
pub trait IsIntId:
std::ops::Add
+ std::ops::AddAssign
+ Eq
+ std::hash::Hash
+ std::str::FromStr
+ std::fmt::Display
+ From<u8>
+ Copy
+ Sized
{
const MAX: Self;
fn from_str_radix(src: &str, radix: u32) -> Result<Self, std::num::ParseIntError>;
}
impl_is_int_id!(u16);
impl_is_int_id!(u32);