mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 08:06:03 +02:00
Range
refactor (#12405)
# Description Currently, `Range` is a struct with a `from`, `to`, and `incr` field, which are all type `Value`. This PR changes `Range` to be an enum over `IntRange` and `FloatRange` for better type safety / stronger compile time guarantees. Fixes: #11778 Fixes: #11777 Fixes: #11776 Fixes: #11775 Fixes: #11774 Fixes: #11773 Fixes: #11769. # User-Facing Changes Hopefully none, besides bug fixes. Although, the `serde` representation might have changed.
This commit is contained in:
@ -251,7 +251,6 @@ mod tests {
|
||||
|
||||
let options = Arguments {
|
||||
substring: String::from("Lm"),
|
||||
|
||||
range: None,
|
||||
cell_paths: None,
|
||||
end: false,
|
||||
@ -266,12 +265,14 @@ mod tests {
|
||||
#[test]
|
||||
fn returns_index_of_next_substring() {
|
||||
let word = Value::test_string("Cargo.Cargo");
|
||||
let range = Range {
|
||||
from: Value::int(1, Span::test_data()),
|
||||
incr: Value::int(1, Span::test_data()),
|
||||
to: Value::nothing(Span::test_data()),
|
||||
inclusion: RangeInclusion::Inclusive,
|
||||
};
|
||||
let range = Range::new(
|
||||
Value::int(1, Span::test_data()),
|
||||
Value::nothing(Span::test_data()),
|
||||
Value::nothing(Span::test_data()),
|
||||
RangeInclusion::Inclusive,
|
||||
Span::test_data(),
|
||||
)
|
||||
.expect("valid range");
|
||||
|
||||
let spanned_range = Spanned {
|
||||
item: range,
|
||||
@ -294,12 +295,14 @@ mod tests {
|
||||
#[test]
|
||||
fn index_does_not_exist_due_to_end_index() {
|
||||
let word = Value::test_string("Cargo.Banana");
|
||||
let range = Range {
|
||||
from: Value::nothing(Span::test_data()),
|
||||
inclusion: RangeInclusion::Inclusive,
|
||||
incr: Value::int(1, Span::test_data()),
|
||||
to: Value::int(5, Span::test_data()),
|
||||
};
|
||||
let range = Range::new(
|
||||
Value::nothing(Span::test_data()),
|
||||
Value::nothing(Span::test_data()),
|
||||
Value::int(5, Span::test_data()),
|
||||
RangeInclusion::Inclusive,
|
||||
Span::test_data(),
|
||||
)
|
||||
.expect("valid range");
|
||||
|
||||
let spanned_range = Spanned {
|
||||
item: range,
|
||||
@ -322,12 +325,14 @@ mod tests {
|
||||
#[test]
|
||||
fn returns_index_of_nums_in_middle_due_to_index_limit_from_both_ends() {
|
||||
let word = Value::test_string("123123123");
|
||||
let range = Range {
|
||||
from: Value::int(2, Span::test_data()),
|
||||
incr: Value::int(1, Span::test_data()),
|
||||
to: Value::int(6, Span::test_data()),
|
||||
inclusion: RangeInclusion::Inclusive,
|
||||
};
|
||||
let range = Range::new(
|
||||
Value::int(2, Span::test_data()),
|
||||
Value::nothing(Span::test_data()),
|
||||
Value::int(6, Span::test_data()),
|
||||
RangeInclusion::Inclusive,
|
||||
Span::test_data(),
|
||||
)
|
||||
.expect("valid range");
|
||||
|
||||
let spanned_range = Spanned {
|
||||
item: range,
|
||||
@ -350,12 +355,14 @@ mod tests {
|
||||
#[test]
|
||||
fn index_does_not_exists_due_to_strict_bounds() {
|
||||
let word = Value::test_string("123456");
|
||||
let range = Range {
|
||||
from: Value::int(2, Span::test_data()),
|
||||
incr: Value::int(1, Span::test_data()),
|
||||
to: Value::int(5, Span::test_data()),
|
||||
inclusion: RangeInclusion::RightExclusive,
|
||||
};
|
||||
let range = Range::new(
|
||||
Value::int(2, Span::test_data()),
|
||||
Value::nothing(Span::test_data()),
|
||||
Value::int(5, Span::test_data()),
|
||||
RangeInclusion::RightExclusive,
|
||||
Span::test_data(),
|
||||
)
|
||||
.expect("valid range");
|
||||
|
||||
let spanned_range = Spanned {
|
||||
item: range,
|
||||
@ -381,7 +388,6 @@ mod tests {
|
||||
|
||||
let options = Arguments {
|
||||
substring: String::from("ふが"),
|
||||
|
||||
range: None,
|
||||
cell_paths: None,
|
||||
end: false,
|
||||
@ -396,12 +402,14 @@ mod tests {
|
||||
fn index_is_not_a_char_boundary() {
|
||||
let word = Value::string(String::from("💛"), Span::test_data());
|
||||
|
||||
let range = Range {
|
||||
from: Value::int(0, Span::test_data()),
|
||||
incr: Value::int(1, Span::test_data()),
|
||||
to: Value::int(3, Span::test_data()),
|
||||
inclusion: RangeInclusion::Inclusive,
|
||||
};
|
||||
let range = Range::new(
|
||||
Value::int(0, Span::test_data()),
|
||||
Value::int(1, Span::test_data()),
|
||||
Value::int(3, Span::test_data()),
|
||||
RangeInclusion::Inclusive,
|
||||
Span::test_data(),
|
||||
)
|
||||
.expect("valid range");
|
||||
|
||||
let spanned_range = Spanned {
|
||||
item: range,
|
||||
@ -425,12 +433,14 @@ mod tests {
|
||||
fn index_is_out_of_bounds() {
|
||||
let word = Value::string(String::from("hello"), Span::test_data());
|
||||
|
||||
let range = Range {
|
||||
from: Value::int(-1, Span::test_data()),
|
||||
incr: Value::int(1, Span::test_data()),
|
||||
to: Value::int(3, Span::test_data()),
|
||||
inclusion: RangeInclusion::Inclusive,
|
||||
};
|
||||
let range = Range::new(
|
||||
Value::int(-1, Span::test_data()),
|
||||
Value::int(1, Span::test_data()),
|
||||
Value::int(3, Span::test_data()),
|
||||
RangeInclusion::Inclusive,
|
||||
Span::test_data(),
|
||||
)
|
||||
.expect("valid range");
|
||||
|
||||
let spanned_range = Spanned {
|
||||
item: range,
|
||||
|
Reference in New Issue
Block a user