Skip to content

Commit 68df4f2

Browse files
committed
feat(cli): add tracing instrumentation to QueryArgs and improve error handling
1 parent e6bccac commit 68df4f2

File tree

2 files changed

+48
-4
lines changed

2 files changed

+48
-4
lines changed

src/cli/command/query.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use clap::Args;
66
use eyre::Context;
77
use rayon::iter::IntoParallelRefIterator;
88
use rayon::iter::ParallelIterator;
9+
use tracing::instrument;
910
use std::ffi::OsString;
1011
use std::path::PathBuf;
1112
use std::sync::Arc;
@@ -27,6 +28,7 @@ pub struct QueryArgs {
2728

2829
impl QueryArgs {
2930
pub fn invoke(self) -> eyre::Result<()> {
31+
info!("Running query with args: {:?}", self);
3032
if self.query.trim().is_empty() {
3133
eyre::bail!("query string required")
3234
}
@@ -59,9 +61,9 @@ impl QueryArgs {
5961
.par_iter()
6062
.map(|(drive_letter, mft_path)| {
6163
let drive_letter = drive_letter.to_string();
62-
let files = process_mft_file(&drive_letter, mft_path).wrap_err(
63-
format!("Failed to process MFT file for drive {drive_letter}"),
64-
)?;
64+
let files = process_mft_file(&drive_letter, mft_path).wrap_err(format!(
65+
"Failed to process MFT file for drive {drive_letter}"
66+
))?;
6567
info!(
6668
drive_letter = &drive_letter,
6769
"Found {} paths to be queried against",
@@ -95,7 +97,9 @@ impl QueryArgs {
9597
let snapshot = nucleo.snapshot();
9698
info!("Found {} matching items", snapshot.matched_item_count());
9799
for (i, item) in snapshot.matched_items(..).enumerate() {
98-
if i >= self.limit { break; }
100+
if i >= self.limit {
101+
break;
102+
}
99103
println!("{}", item.data.display());
100104
}
101105

src/drive_letter_pattern.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use arbitrary::Arbitrary;
22
use color_eyre::eyre::{self as eyre};
3+
use serde::Deserialize;
4+
use serde::Serialize;
35
use std::fmt;
46
use std::str::FromStr;
57

@@ -45,6 +47,44 @@ impl FromStr for DriveLetterPattern {
4547
}
4648
}
4749

50+
impl<'de> Deserialize<'de> for DriveLetterPattern {
51+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
52+
where
53+
D: serde::Deserializer<'de>,
54+
{
55+
let s = String::deserialize(deserializer)?;
56+
s.parse().map_err(serde::de::Error::custom)
57+
}
58+
}
59+
60+
impl Serialize for DriveLetterPattern {
61+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
62+
where
63+
S: serde::Serializer,
64+
{
65+
serializer.serialize_str(&self.0)
66+
}
67+
}
68+
#[cfg(test)]
69+
mod test {
70+
use crate::drive_letter_pattern::DriveLetterPattern;
71+
72+
#[tokio::test]
73+
async fn serialize() -> eyre::Result<()> {
74+
let pattern = DriveLetterPattern("C,D;E F".to_string());
75+
let serialized = serde_json::to_string(&pattern)?;
76+
assert_eq!(serialized, "\"C,D;E F\"");
77+
Ok(())
78+
}
79+
#[tokio::test]
80+
async fn deserialize() -> eyre::Result<()> {
81+
let s = "\"C,D;E F\"";
82+
let deserialized: DriveLetterPattern = serde_json::from_str(s)?;
83+
assert_eq!(deserialized, DriveLetterPattern("C,D;E F".to_string()));
84+
Ok(())
85+
}
86+
}
87+
4888
impl<'a> Arbitrary<'a> for DriveLetterPattern {
4989
fn arbitrary(u: &mut arbitrary::Unstructured<'_>) -> arbitrary::Result<Self> {
5090
// 20% chance wildcard, 80% chance letters

0 commit comments

Comments
 (0)