use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub enum ErrorTraceSchemaVersion {
#[serde(rename = "1")]
V1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum FrameOrigin {
InProject,
NodeModules,
OutOfCorpus,
}
impl FrameOrigin {
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::InProject => "in-project",
Self::NodeModules => "node-modules",
Self::OutOfCorpus => "out-of-corpus",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[serde(rename_all = "snake_case")]
pub enum FrameResolution {
Resolved,
Ambiguous,
NotFound,
NotAttempted,
}
impl FrameResolution {
#[must_use]
pub const fn label(self) -> &'static str {
match self {
Self::Resolved => "resolved",
Self::Ambiguous => "ambiguous",
Self::NotFound => "not-found",
Self::NotAttempted => "not-attempted",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ErrorTraceCandidate {
pub file: String,
pub symbol: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub member: Option<String>,
pub kind: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub line: Option<u32>,
}
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ErrorTraceFrame {
pub index: usize,
pub raw: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub function: Option<String>,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub is_constructor: bool,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub is_async: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub file: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub line: Option<u32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub column: Option<u32>,
pub origin: FrameOrigin,
pub resolution: FrameResolution,
pub candidates: Vec<ErrorTraceCandidate>,
pub candidates_omitted: usize,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub line_mismatch: bool,
pub reason: String,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
pub struct ErrorTraceCounts {
pub frames: usize,
pub frames_omitted: usize,
pub in_project: usize,
pub node_modules: usize,
pub out_of_corpus: usize,
pub resolved: usize,
pub ambiguous: usize,
pub not_found: usize,
pub not_attempted: usize,
pub unparsed_lines: usize,
}
#[derive(Debug, Clone, Serialize)]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[cfg_attr(feature = "schema", schemars(title = "fallow trace-error"))]
pub struct ErrorTrace {
pub schema_version: ErrorTraceSchemaVersion,
pub source: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub header: Option<String>,
pub frames: Vec<ErrorTraceFrame>,
pub counts: ErrorTraceCounts,
pub reason: String,
}