diff --git a/src/frame/base.rs b/src/frame/base.rs index 4698dee..6b84490 100644 --- a/src/frame/base.rs +++ b/src/frame/base.rs @@ -232,10 +232,17 @@ impl Frame { } (RowIndex::Date(vals), RowIndexLookup::Date(lookup)) } - Some(RowIndex::Range(_)) => { - panic!( - "Frame::new: Cannot explicitly provide a Range index. Use None for default range." - ); + Some(RowIndex::Range(ref r)) => { + // If the length of the range does not match the number of rows, panic. + if r.end.saturating_sub(r.start) != num_rows { + panic!( + "Frame::new: Range index length ({}) mismatch matrix rows ({})", + r.end.saturating_sub(r.start), + num_rows + ); + } + // return the range as is. + (RowIndex::Range(r.clone()), RowIndexLookup::None) } None => { // Default to a sequential range index. @@ -1129,10 +1136,10 @@ mod tests { Frame::new(matrix, vec!["X", "Y"], Some(index)); } #[test] - #[should_panic(expected = "Cannot explicitly provide a Range index")] - fn frame_new_panic_explicit_range() { - let matrix = create_test_matrix_f64(); - let index = RowIndex::Range(0..3); // User cannot provide Range directly + #[should_panic(expected = "Frame::new: Range index length (4) mismatch matrix rows (3)")] + fn frame_new_panic_invalid_explicit_range_index() { + let matrix = create_test_matrix_f64(); // 3 rows + let index = RowIndex::Range(0..4); // Range 0..4 but only 3 rows Frame::new(matrix, vec!["A", "B"], Some(index)); }