1use crate::thread::{ProcessRef, ThreadRef};
6use flyweights::FlyStr;
7use nom::error::ErrorKind;
8use std::num::NonZeroU16;
9
10pub(crate) type ParseResult<'a, T> = nom::IResult<&'a [u8], T, ParseError>;
11
12#[derive(Debug, thiserror::Error)]
13pub enum ParseError {
14 #[error("nom parsing error: {1:?}")]
16 Nom(nom::error::ErrorKind, #[source] Option<Box<Self>>),
17
18 #[error("failure reading the trace session")]
20 Io(#[source] std::io::Error),
21
22 #[error("couldn't parse string as utf-8")]
24 InvalidUtf8(
25 #[from]
26 #[source]
27 std::str::Utf8Error,
28 ),
29
30 #[error("trace session didn't start with the magic number record")]
32 MissingMagicNumber,
33
34 #[error("expected type {expected} for {context}, observed type {observed}")]
36 WrongType { expected: u8, observed: u8, context: &'static str },
37
38 #[error("got the wrong magic number: {observed}")]
40 InvalidMagicNumber { observed: u32 },
41
42 #[error("got an invalid ref")]
44 InvalidRef,
45
46 #[error("invalid length prefix encountered")]
48 InvalidSize,
49}
50
51impl nom::error::ParseError<&[u8]> for ParseError {
52 fn from_error_kind(_input: &[u8], kind: nom::error::ErrorKind) -> Self {
53 ParseError::Nom(kind, None)
54 }
55
56 fn append(_input: &[u8], kind: nom::error::ErrorKind, prev: Self) -> Self {
57 ParseError::Nom(kind, Some(Box::new(prev)))
58 }
59}
60
61impl nom::error::FromExternalError<&[u8], ParseError> for ParseError {
62 fn from_external_error(_input: &[u8], _kind: ErrorKind, e: ParseError) -> Self {
63 e
64 }
65}
66
67#[derive(Clone, Debug, thiserror::Error, PartialEq)]
70pub enum ParseWarning {
71 #[error("encountered unknown thread reference `{_0:?}`")]
72 UnknownThreadRef(ThreadRef),
73
74 #[error("encountered unknown process reference `{_0:?}`")]
75 UnknownProcessRef(ProcessRef),
76
77 #[error("encountered unknown trace record type {_0}")]
78 UnknownTraceRecordType(u8),
79
80 #[error("skipped arg '{name}' because of unknown type")]
81 SkippingArgWithUnknownType { name: FlyStr },
82
83 #[error("encountered unknown provider id {_0}")]
84 UnknownProviderId(u32),
85
86 #[error("encountered unknown string id {_0}")]
87 UnknownStringId(NonZeroU16),
88
89 #[error("encountered an empty string record")]
90 RecordForZeroStringId,
91
92 #[error("encountered unknown large blob type {_0}")]
93 UnknownLargeBlobType(u8),
94
95 #[error("encountered unknown metadata record type {_0}")]
96 UnknownMetadataRecordType(u8),
97
98 #[error("encountered unknown scheduling record type {_0}")]
99 UnknownSchedulingRecordType(u8),
100}