use ra_ap_syntax::{AstToken, TextRange};
use crate::meta::{MetaName, MetaNameValue, MetaOption, MetaValue};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct InkArg {
kind: InkArgKind,
meta: MetaNameValue,
}
impl From<MetaNameValue> for InkArg {
fn from(meta: MetaNameValue) -> Self {
Self {
kind: if let MetaOption::Ok(name) = meta.name() {
InkArgKind::from(name.text())
} else {
InkArgKind::Unknown
},
meta,
}
}
}
impl InkArg {
pub fn kind(&self) -> &InkArgKind {
&self.kind
}
pub fn meta(&self) -> &MetaNameValue {
&self.meta
}
pub fn text_range(&self) -> TextRange {
self.meta.text_range()
}
pub fn name(&self) -> Option<&MetaName> {
self.meta.name().result().ok()
}
pub fn value(&self) -> Option<&MetaValue> {
self.meta.value().result().ok()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum InkArgKind {
Anonymous,
Constructor,
Default,
Env,
Event,
Extension,
HandleStatus,
Impl,
KeepAttr,
Message,
Namespace,
Payable,
Selector,
Storage,
Topic,
Unknown,
}
impl From<&str> for InkArgKind {
fn from(arg_name: &str) -> Self {
match arg_name {
"anonymous" => InkArgKind::Anonymous,
"constructor" => InkArgKind::Constructor,
"default" => InkArgKind::Default,
"env" => InkArgKind::Env,
"event" => InkArgKind::Event,
"extension" => InkArgKind::Extension,
"handle_status" => InkArgKind::HandleStatus,
"impl" => InkArgKind::Impl,
"keep_attr" => InkArgKind::KeepAttr,
"message" => InkArgKind::Message,
"namespace" => InkArgKind::Namespace,
"payable" => InkArgKind::Payable,
"selector" => InkArgKind::Selector,
"storage" => InkArgKind::Storage,
"topic" => InkArgKind::Topic,
_ => InkArgKind::Unknown,
}
}
}