From e72a0de8c76a38e5294ac7d108c03387ecfc075a Mon Sep 17 00:00:00 2001 From: Oliver Hamlet Date: Fri, 2 Jan 2026 14:44:22 +0000 Subject: [PATCH] Avoid functions stabilised in Rust v1.91.0 The Flatpak build environment used by LOOT provides an older version of the Rust toolchain. --- src/database/mod.rs | 5 +++- src/metadata/error.rs | 10 ++++++- src/metadata/metadata_document.rs | 49 +++++++++++++++++-------------- src/metadata/mod.rs | 2 +- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/database/mod.rs b/src/database/mod.rs index f3f1b840..8da34b8c 100644 --- a/src/database/mod.rs +++ b/src/database/mod.rs @@ -312,7 +312,10 @@ impl Database { } fn validate_write_path(output_path: &Path, mode: WriteMode) -> Result<(), WriteMetadataError> { - if !output_path.parent().is_some_and(|p| p == "" || p.exists()) { + if !output_path + .parent() + .is_some_and(|p| p.as_os_str().is_empty() || p.exists()) + { Err(WriteMetadataError::new( output_path.into(), WriteMetadataErrorReason::ParentDirectoryNotFound, diff --git a/src/metadata/error.rs b/src/metadata/error.rs index 3ef51d8a..8d2e071d 100644 --- a/src/metadata/error.rs +++ b/src/metadata/error.rs @@ -161,9 +161,17 @@ struct Position { fn adjust_location(pos: &Position, diff_span: &PreludeDiffSpan) -> (Position, bool) { if pos.line > diff_span.end_line { + // TODO: usize::saturating_sub_signed() is stable as of Rust 1.91.0, but the org.freedesktop.Sdk.Extension.rust-stable extension for LOOT's Flatpak build environment supplies an older version of Rust, so this can only be updated to use saturating_sub_signed() once it's available in that environment. + let line = if diff_span.lines_added_count.is_negative() { + pos.line + .saturating_add(diff_span.lines_added_count.unsigned_abs()) + } else { + pos.line + .saturating_sub(diff_span.lines_added_count.unsigned_abs()) + }; ( Position { - line: pos.line.saturating_sub_signed(diff_span.line_count_delta), + line, column: pos.column, }, false, diff --git a/src/metadata/metadata_document.rs b/src/metadata/metadata_document.rs index 80bc335e..8c24044d 100644 --- a/src/metadata/metadata_document.rs +++ b/src/metadata/metadata_document.rs @@ -392,24 +392,29 @@ fn replace_prelude( // The last line of the prelude. let prelude_end_line = prelude_start_line + new_prelude_line_count.saturating_sub(1); - let line_count_delta = new_prelude_line_count - .checked_signed_diff(old_prelude_line_count) - .ok_or_else(|| { - ParseMetadataError::new( - saphyr::Marker::new(before_prelude.len(), prelude_start_line, 0), - MetadataParsingErrorReason::PreludeSubstitutionOverflow { - new_prelude_count: new_prelude_line_count, - old_prelude_count: old_prelude_line_count, - }, - ) - })?; + // TODO: usize::checked_signed_diff() is stable as of Rust 1.91.0, but the org.freedesktop.Sdk.Extension.rust-stable extension for LOOT's Flatpak build environment supplies an older version of Rust, so this can only be updated to use checked_signed_diff() once it's available in that environment. + let lines_added_count = if new_prelude_line_count >= old_prelude_line_count { + isize::try_from(new_prelude_line_count - old_prelude_line_count) + } else { + isize::try_from(old_prelude_line_count - new_prelude_line_count).map(std::ops::Neg::neg) + }; + + let lines_added_count = lines_added_count.map_err(|_e| { + ParseMetadataError::new( + saphyr::Marker::new(before_prelude.len(), prelude_start_line, 0), + MetadataParsingErrorReason::PreludeSubstitutionOverflow { + new_prelude_count: new_prelude_line_count, + old_prelude_count: old_prelude_line_count, + }, + ) + })?; Ok(MasterlistWithReplacedPrelude { masterlist, meta: Some(PreludeDiffSpan { start_line: prelude_start_line, end_line: prelude_end_line, - line_count_delta, + lines_added_count, }), }) } else { @@ -1154,7 +1159,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(2, result.meta.as_ref().unwrap().start_line); assert_eq!(5, result.meta.as_ref().unwrap().end_line); - assert_eq!(2, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(2, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1183,7 +1188,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(2, result.meta.as_ref().unwrap().start_line); assert_eq!(5, result.meta.as_ref().unwrap().end_line); - assert_eq!(3, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(3, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1211,7 +1216,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(2, result.meta.as_ref().unwrap().start_line); assert_eq!(4, result.meta.as_ref().unwrap().end_line); - assert_eq!(1, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(1, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1238,7 +1243,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(2, result.meta.as_ref().unwrap().start_line); assert_eq!(4, result.meta.as_ref().unwrap().end_line); - assert_eq!(2, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(2, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1267,7 +1272,7 @@ prelude: assert_eq!(expected_result, result.masterlist); assert_eq!(4, result.meta.as_ref().unwrap().start_line); assert_eq!(7, result.meta.as_ref().unwrap().end_line); - assert_eq!(1, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(1, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1308,7 +1313,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(5, result.meta.as_ref().unwrap().start_line); assert_eq!(11, result.meta.as_ref().unwrap().end_line); - assert_eq!(6, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(6, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1338,7 +1343,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(2, result.meta.as_ref().unwrap().start_line); assert_eq!(5, result.meta.as_ref().unwrap().end_line); - assert_eq!(2, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(2, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1362,7 +1367,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(2, result.meta.as_ref().unwrap().start_line); assert_eq!(2, result.meta.as_ref().unwrap().end_line); - assert_eq!(-1, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(-1, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1394,7 +1399,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(2, result.meta.as_ref().unwrap().start_line); assert_eq!(5, result.meta.as_ref().unwrap().end_line); - assert_eq!(0, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(0, result.meta.as_ref().unwrap().lines_added_count); } #[test] @@ -1425,7 +1430,7 @@ plugins: assert_eq!(expected_result, result.masterlist); assert_eq!(2, result.meta.as_ref().unwrap().start_line); assert_eq!(5, result.meta.as_ref().unwrap().end_line); - assert_eq!(1, result.meta.as_ref().unwrap().line_count_delta); + assert_eq!(1, result.meta.as_ref().unwrap().lines_added_count); } } } diff --git a/src/metadata/mod.rs b/src/metadata/mod.rs index 8d18a525..867e50c4 100644 --- a/src/metadata/mod.rs +++ b/src/metadata/mod.rs @@ -22,7 +22,7 @@ pub use tag::{Tag, TagSuggestion}; struct PreludeDiffSpan { start_line: usize, end_line: usize, - line_count_delta: isize, + lines_added_count: isize, } #[cfg(test)]