forked from extern/nushell
Support range in str substring (#6867)
This commit is contained in:
parent
24a98f8999
commit
17b2bcc125
@ -65,12 +65,18 @@ impl Command for SubCommand {
|
||||
fn examples(&self) -> Vec<Example> {
|
||||
vec![
|
||||
Example {
|
||||
description: "Get a substring \"nushell\" from the text \"good nushell\"",
|
||||
description:
|
||||
"Get a substring \"nushell\" from the text \"good nushell\" using a range",
|
||||
example: " 'good nushell' | str substring 5..12",
|
||||
result: Some(Value::test_string("nushell")),
|
||||
},
|
||||
Example {
|
||||
description: "Alternately, you can pass in a list",
|
||||
example: " 'good nushell' | str substring [5 12]",
|
||||
result: Some(Value::test_string("nushell")),
|
||||
},
|
||||
Example {
|
||||
description: "Alternatively, you can use the form",
|
||||
description: "Or a simple comma-separated string",
|
||||
example: " 'good nushell' | str substring '5,12'",
|
||||
result: Some(Value::test_string("nushell")),
|
||||
},
|
||||
@ -199,6 +205,11 @@ fn action(input: &Value, options: &Substring, head: Span) -> Value {
|
||||
|
||||
fn process_arguments(options: &Arguments, head: Span) -> Result<(isize, isize), ShellError> {
|
||||
let search = match &options.range {
|
||||
Value::Range { val, .. } => {
|
||||
let start = val.from()?;
|
||||
let end = val.to()?;
|
||||
Ok(SubstringText(start.to_string(), end.to_string()))
|
||||
}
|
||||
Value::List { vals, .. } => {
|
||||
if vals.len() > 2 {
|
||||
Err(ShellError::UnsupportedInput(
|
||||
|
@ -122,6 +122,19 @@ impl Range {
|
||||
matches!(self.inclusion, RangeInclusion::Inclusive)
|
||||
}
|
||||
|
||||
pub fn from(&self) -> Result<i64, ShellError> {
|
||||
self.from.as_integer()
|
||||
}
|
||||
|
||||
pub fn to(&self) -> Result<i64, ShellError> {
|
||||
let to = self.to.as_integer()?;
|
||||
if self.is_end_inclusive() {
|
||||
Ok(to)
|
||||
} else {
|
||||
Ok(to - 1)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn contains(&self, item: &Value) -> bool {
|
||||
match (item.partial_cmp(&self.from), item.partial_cmp(&self.to)) {
|
||||
(Some(Ordering::Greater | Ordering::Equal), Some(Ordering::Less)) => self.moves_up(),
|
||||
|
Loading…
Reference in New Issue
Block a user