#[derive(Clone, Debug, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)]
pub struct Location {
pub line: u32,
pub column: u32,
pub file: String,
}
impl<'a> From<&'a std::panic::Location<'a>> for Location {
fn from(l: &'a std::panic::Location<'a>) -> Self {
Self {
line: l.line(),
column: l.column(),
file: l.file().into(),
}
}
}
impl Location {
#[track_caller]
pub fn caller() -> Self {
std::panic::Location::caller().into()
}
}
#[derive(Debug, Hash, Eq, PartialEq, Clone, serde::Serialize, serde::Deserialize)]
pub struct RawIdentifiers {
pub registered_at: RegisteredAt,
pub import_path: String,
}
#[derive(Clone, Debug, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize)]
pub struct RegisteredAt {
pub crate_name: String,
pub module_path: String,
}
impl RawIdentifiers {
#[track_caller]
pub fn from_raw_parts(import_path: String, registered_at: RegisteredAt) -> Self {
Self {
registered_at,
import_path,
}
}
pub fn fully_qualified_path(&self) -> Vec<String> {
let mut segments: Vec<_> = self
.import_path
.split("::")
.map(|s| s.trim())
.map(ToOwned::to_owned)
.collect();
if segments[0] == "crate" {
segments[0] = self.registered_at.crate_name.replace('-', "_");
segments
} else if segments[0] == "self" {
let mut new_segments: Vec<_> = self
.registered_at
.module_path
.split("::")
.map(|s| s.trim())
.map(ToOwned::to_owned)
.collect();
new_segments.extend(segments.into_iter().skip(1));
new_segments
} else if segments[0] == "super" {
let n_super: usize = {
let mut n_super = 0;
let iter = segments.iter();
for p in iter {
if p == "super" {
n_super += 1;
} else {
break;
}
}
n_super
};
let module_segments: Vec<_> = self
.registered_at
.module_path
.split("::")
.map(|s| s.trim())
.map(ToOwned::to_owned)
.collect();
let n_module_segments = module_segments.len();
module_segments
.into_iter()
.take(n_module_segments - n_super)
.chain(segments.into_iter().skip(n_super))
.collect()
} else {
segments
}
}
pub fn raw_path(&self) -> &str {
&self.import_path
}
pub fn registered_at(&self) -> &RegisteredAt {
&self.registered_at
}
}