use crate::import::*;
#[ derive( Debug, Clone, PartialEq, Eq, Hash ) ]
pub struct ActorInfo
{
pub(crate) id : usize ,
pub(crate) name : Arc<str> ,
pub(crate) type_name: String ,
}
impl ActorInfo
{
pub(crate) fn new<A: Actor>( id: usize, name: Arc<str> ) -> Self
{
Self
{
id ,
name ,
type_name: Self::gen_name::<A>() ,
}
}
fn gen_name<A: Actor>() -> String
{
let name = std::any::type_name::<A>();
match name.split( "::" ).last()
{
Some(t) => t.to_string(),
None => name.to_string(),
}
}
pub fn type_name( &self ) -> &str
{
&self.type_name
}
pub fn span( &self ) -> Span
{
if self.name.is_empty()
{
error_span!( "actor", id = self.id, "type" = self.type_name() )
}
else
{
error_span!( "actor", id = self.id, "type" = self.type_name(), a_name = self.name.as_ref() )
}
}
}
impl Identify for ActorInfo
{
fn id( &self ) -> usize
{
self.id
}
fn name( &self ) -> Arc<str>
{
self.name.clone()
}
}
impl From<ActorInfo> for String
{
fn from( info: ActorInfo ) -> String
{
format!( "{}", info )
}
}
impl fmt::Display for ActorInfo
{
fn fmt( &self, f: &mut fmt::Formatter<'_> ) -> fmt::Result
{
if self.name.is_empty()
{
write!( f, "{}: id={}", self.type_name(), self.id )
}
else
{
write!( f, "{}: id={}, name={}", self.type_name(), self.id, self.name )
}
}
}