From 9559a410d3cbc3af63f2cbc0af3140d50007ce21 Mon Sep 17 00:00:00 2001 From: Stuart Axelbrooke Date: Thu, 16 Oct 2025 19:33:18 -0700 Subject: [PATCH] impl log line parsing --- databuild/data_deps.rs | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/databuild/data_deps.rs b/databuild/data_deps.rs index 4bc9b6e..03081aa 100644 --- a/databuild/data_deps.rs +++ b/databuild/data_deps.rs @@ -2,8 +2,7 @@ use crate::JobRunMissingDeps; pub struct LogLine(String); -const DATABUILD_JSON: &str = "DATABUILD_JSON:"; -const DATABUILD_JSON_LEN: usize = DATABUILD_JSON.len(); +const DATABUILD_JSON: &str = "DATABUILD_MISSING_DEPS_JSON:"; impl From for Option { fn from(value: LogLine) -> Self { @@ -16,6 +15,36 @@ fn line_matches(line: &str) -> Option<&str> { } fn json_to_missing_deps(line: &str) -> Option { - todo!() + serde_json::from_str(line).ok() } +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse_missing_deps_with_1_to_1_and_1_to_n() { + let log_line = LogLine( + r#"DATABUILD_MISSING_DEPS_JSON:{"missing_deps":[{"impacted":[{"ref":"output/p1"}],"missing":[{"ref":"input/p1"}]},{"impacted":[{"ref":"output/p2"},{"ref":"output/p3"}],"missing":[{"ref":"input/p2"}]}]}"#.to_string() + ); + + let result: Option = log_line.into(); + assert!(result.is_some()); + + let missing_deps = result.unwrap(); + assert_eq!(missing_deps.missing_deps.len(), 2); + + // First entry: 1:1 (one missing input -> one impacted output) + assert_eq!(missing_deps.missing_deps[0].impacted.len(), 1); + assert_eq!(missing_deps.missing_deps[0].impacted[0].r#ref, "output/p1"); + assert_eq!(missing_deps.missing_deps[0].missing.len(), 1); + assert_eq!(missing_deps.missing_deps[0].missing[0].r#ref, "input/p1"); + + // Second entry: 1:N (one missing input -> multiple impacted outputs) + assert_eq!(missing_deps.missing_deps[1].impacted.len(), 2); + assert_eq!(missing_deps.missing_deps[1].impacted[0].r#ref, "output/p2"); + assert_eq!(missing_deps.missing_deps[1].impacted[1].r#ref, "output/p3"); + assert_eq!(missing_deps.missing_deps[1].missing.len(), 1); + assert_eq!(missing_deps.missing_deps[1].missing[0].r#ref, "input/p2"); + } +}