use alloc::borrow::Cow;
use crate::{
func::args::{GetOwnership, Ownership},
type_info::impl_type_methods,
Type, TypePath,
};
#[derive(Debug, Clone)]
pub struct ArgInfo {
index: usize,
name: Option<Cow<'static, str>>,
ownership: Ownership,
ty: Type,
}
impl ArgInfo {
pub fn new<T: TypePath + GetOwnership>(index: usize) -> Self {
Self {
index,
name: None,
ownership: T::ownership(),
ty: Type::of::<T>(),
}
}
pub fn with_name(mut self, name: impl Into<Cow<'static, str>>) -> Self {
self.name = Some(name.into());
self
}
pub fn index(&self) -> usize {
self.index
}
pub fn name(&self) -> Option<&str> {
self.name.as_deref()
}
pub fn ownership(&self) -> Ownership {
self.ownership
}
impl_type_methods!(ty);
pub fn id(&self) -> ArgId {
self.name
.clone()
.map(ArgId::Name)
.unwrap_or_else(|| ArgId::Index(self.index))
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ArgId {
Index(usize),
Name(Cow<'static, str>),
}