use super::*;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CallSite {
pub node: NodeId,
pub function: &'static str,
pub frame_id: u64,
pub source: Option<SourceLocation>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct CallEdge {
pub caller: CallSite,
pub callee: CallSite,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum EvidenceKind {
Live,
Source,
Mir,
External,
Unknown,
}
impl EvidenceKind {
pub const fn marker(self) -> &'static str {
match self {
Self::Live => "+",
Self::Mir => "?",
Self::Source => "~",
Self::External => "x",
Self::Unknown => "!",
}
}
pub const fn label(self) -> &'static str {
match self {
Self::Live => "live",
Self::Mir => "mir",
Self::Source => "source",
Self::External => "external",
Self::Unknown => "unknown",
}
}
pub const fn confirmed(self) -> bool {
matches!(self, Self::Live)
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct LogicalCallEdge {
pub caller: CallSite,
pub callee: CallSite,
pub evidence: EvidenceKind,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum TraceMode {
#[default]
Off,
ErrorsOnly,
Full,
}
impl TraceMode {
pub fn parse(value: &str) -> Option<Self> {
match value.trim().to_ascii_lowercase().as_str() {
"off" | "0" | "disabled" => Some(Self::Off),
"errors-only" | "errors_only" | "errors" => Some(Self::ErrorsOnly),
"full" | "all" => Some(Self::Full),
_ => None,
}
}
}
#[cfg(test)]
mod trace_mode_tests {
use super::TraceMode;
#[test]
fn parse_accepts_documented_spellings() {
assert_eq!(TraceMode::parse("off"), Some(TraceMode::Off));
assert_eq!(TraceMode::parse("ERRORS-ONLY"), Some(TraceMode::ErrorsOnly));
assert_eq!(TraceMode::parse(" full "), Some(TraceMode::Full));
assert_eq!(TraceMode::parse("sometimes"), None);
}
}