Skip to content

Commit 7fd1d1a

Browse files
authored
Merge pull request #33 from shindan-io/oxidized_preamble_parsing
2 parents 20579ec + ef252b1 commit 7fd1d1a

File tree

4 files changed

+34
-27
lines changed

4 files changed

+34
-27
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ simplelog = "0.12.2"
2222
csv = "1.3.0"
2323
chrono = "0.4.38"
2424
criterion = "0.5.1"
25+
anyhow = "1.0.93"
2526

2627
[[bench]]
2728
name = "high_sierra_benchmark"

deny.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ allow = [
105105
"BSL-1.0",
106106
"Unlicense",
107107
"Unicode-DFS-2016",
108+
"Unicode-3.0",
108109
]
109110
# List of explicitly disallowed licenses
110111
# See https://spdx.org/licenses/ for list of possible licenses

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
clippy::checked_conversions,
3232
clippy::unnecessary_cast
3333
)]
34+
3435
mod catalog;
3536
mod chunks;
3637
mod chunkset;

src/preamble.rs

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,64 +5,68 @@
55
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
66
// See the License for the specific language governing permissions and limitations under the License.
77

8-
use std::mem::size_of;
9-
108
use nom::{
11-
bytes::complete::take,
129
number::complete::{le_u32, le_u64},
10+
sequence::tuple,
11+
IResult,
1312
};
1413

15-
#[derive(Debug)]
14+
#[derive(Debug, Clone, Copy)]
1615
pub struct LogPreamble {
1716
pub chunk_tag: u32,
1817
pub chunk_sub_tag: u32,
1918
pub chunk_data_size: u64,
2019
}
20+
2121
impl LogPreamble {
2222
/// Get the preamble (first 16 bytes of all Unified Log entries (chunks)) to detect the log (chunk) type. Ex: Firehose, Statedump, Simpledump, Catalog, etc
23-
pub fn detect_preamble(data: &[u8]) -> nom::IResult<&[u8], LogPreamble> {
24-
let mut preamble = LogPreamble {
25-
chunk_tag: 0,
26-
chunk_sub_tag: 0,
27-
chunk_data_size: 0,
28-
};
29-
30-
let (input, tag) = take(size_of::<u32>())(data)?;
31-
let (input, sub_tag) = take(size_of::<u32>())(input)?;
32-
let (input, data_size) = take(size_of::<u64>())(input)?;
33-
34-
let (_, trace_tag) = le_u32(tag)?;
35-
let (_, trace_sub_tag) = le_u32(sub_tag)?;
36-
let (_, trace_data_size) = le_u64(data_size)?;
37-
38-
preamble.chunk_tag = trace_tag;
39-
preamble.chunk_sub_tag = trace_sub_tag;
40-
preamble.chunk_data_size = trace_data_size;
23+
/// Do not consume the input
24+
pub fn detect_preamble(input: &[u8]) -> IResult<&[u8], Self> {
25+
let (_, preamble) = Self::parse(input)?;
4126
Ok((input, preamble))
4227
}
28+
29+
/// Get the preamble (first 16 bytes of all Unified Log entries (chunks)) to detect the log (chunk) type. Ex: Firehose, Statedump, Simpledump, Catalog, etc
30+
/// And consume the input
31+
pub fn parse(input: &[u8]) -> IResult<&[u8], Self> {
32+
let (input, (chunk_tag, chunk_sub_tag, chunk_data_size)) =
33+
tuple((le_u32, le_u32, le_u64))(input)?;
34+
Ok((
35+
input,
36+
LogPreamble {
37+
chunk_tag,
38+
chunk_sub_tag,
39+
chunk_data_size,
40+
},
41+
))
42+
}
4343
}
4444

4545
#[cfg(test)]
4646
mod tests {
4747
use super::LogPreamble;
4848

4949
#[test]
50-
fn test_detect_preamble() {
51-
let test_preamble_header = [
50+
fn test_detect_preamble() -> anyhow::Result<()> {
51+
let test_preamble_header = &[
5252
0, 16, 0, 0, 17, 0, 0, 0, 208, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,
5353
];
5454

55-
let (_, preamble_data) = LogPreamble::detect_preamble(&test_preamble_header).unwrap();
55+
let (output, preamble_data) = LogPreamble::detect_preamble(test_preamble_header)?;
5656

57+
assert_eq!(output, test_preamble_header);
5758
assert_eq!(preamble_data.chunk_tag, 0x1000);
5859
assert_eq!(preamble_data.chunk_sub_tag, 0x11);
5960
assert_eq!(preamble_data.chunk_data_size, 0xd0);
6061

61-
let test_catalog_chunk = [11, 96, 0, 0, 17, 0, 0, 0, 176, 31, 0, 0, 0, 0, 0, 0];
62-
let (_, preamble_data) = LogPreamble::detect_preamble(&test_catalog_chunk).unwrap();
62+
let test_catalog_chunk = &[11, 96, 0, 0, 17, 0, 0, 0, 176, 31, 0, 0, 0, 0, 0, 0];
63+
let (output, preamble_data) = LogPreamble::parse(test_catalog_chunk)?;
6364

65+
assert_eq!(output.len(), 0);
6466
assert_eq!(preamble_data.chunk_tag, 0x600b);
6567
assert_eq!(preamble_data.chunk_sub_tag, 0x11);
6668
assert_eq!(preamble_data.chunk_data_size, 0x1fb0);
69+
70+
Ok(())
6771
}
6872
}

0 commit comments

Comments
 (0)