diff --git a/crates/nu-command/src/network/port.rs b/crates/nu-command/src/network/port.rs index e342fa9ed5..64df0047a8 100644 --- a/crates/nu-command/src/network/port.rs +++ b/crates/nu-command/src/network/port.rs @@ -1,7 +1,7 @@ use nu_engine::CallExt; use nu_protocol::ast::Call; use nu_protocol::engine::{Command, EngineState, Stack}; -use nu_protocol::IntoPipelineData; +use nu_protocol::{IntoPipelineData, Span, Spanned}; use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpListener}; use nu_protocol::{ @@ -67,22 +67,36 @@ fn get_free_port( stack: &mut Stack, call: &Call, ) -> Result { - let start_port: Option = call.opt(engine_state, stack, 0)?; - let end_port: Option = call.opt(engine_state, stack, 1)?; + let start_port: Option> = call.opt(engine_state, stack, 0)?; + let end_port: Option> = call.opt(engine_state, stack, 1)?; let listener = if start_port.is_none() && end_port.is_none() { // get free port from system. TcpListener::bind("127.0.0.1:0")? } else { - let start_port = start_port.unwrap_or(1024); - let end_port = end_port.unwrap_or(65535); + let (start_port, start_span) = match start_port { + Some(p) => (p.item, Some(p.span)), + None => (1024, None), + }; + + let (end_port, end_span) = match end_port { + Some(p) => (p.item, Some(p.span)), + None => (65535, None), + }; + + let range_span = match (start_span, end_span) { + (Some(start), Some(end)) => Span::new(start.start, end.end), + (Some(start), None) => start, + (None, Some(end)) => end, + (None, None) => call.head, + }; // check input range valid. if start_port > end_port { return Err(ShellError::InvalidRange { left_flank: start_port.to_string(), right_flank: end_port.to_string(), - span: call.head, + span: range_span, }); } diff --git a/crates/nu-command/src/random/float.rs b/crates/nu-command/src/random/float.rs index 7aeb694a61..b61fe92d6c 100644 --- a/crates/nu-command/src/random/float.rs +++ b/crates/nu-command/src/random/float.rs @@ -2,7 +2,8 @@ use nu_engine::CallExt; use nu_protocol::ast::Call; use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::{ - Category, Example, PipelineData, Range, ShellError, Signature, Span, SyntaxShape, Type, Value, + Category, Example, PipelineData, Range, ShellError, Signature, Span, Spanned, SyntaxShape, + Type, Value, }; use rand::prelude::{thread_rng, Rng}; use std::cmp::Ordering; @@ -72,10 +73,13 @@ fn float( stack: &mut Stack, call: &Call, ) -> Result { - let span = call.head; - let range: Option = call.opt(engine_state, stack, 0)?; + let mut range_span = call.head; + let range: Option> = call.opt(engine_state, stack, 0)?; + + let (min, max) = if let Some(spanned_range) = range { + let r = spanned_range.item; + range_span = spanned_range.span; - let (min, max) = if let Some(r) = range { if r.is_end_inclusive() { (r.from.as_float()?, r.to.as_float()?) } else if r.to.as_float()? >= 1.0 { @@ -91,7 +95,7 @@ fn float( Some(Ordering::Greater) => Err(ShellError::InvalidRange { left_flank: min.to_string(), right_flank: max.to_string(), - span, + span: range_span, }), Some(Ordering::Equal) => Ok(PipelineData::Value( Value::float(min, Span::new(64, 64)), diff --git a/crates/nu-command/src/random/int.rs b/crates/nu-command/src/random/int.rs index 4bbd7b7f75..ccbc2f92f1 100644 --- a/crates/nu-command/src/random/int.rs +++ b/crates/nu-command/src/random/int.rs @@ -2,7 +2,8 @@ use nu_engine::CallExt; use nu_protocol::ast::Call; use nu_protocol::engine::{Command, EngineState, Stack}; use nu_protocol::{ - Category, Example, PipelineData, Range, ShellError, Signature, SyntaxShape, Type, Value, + Category, Example, PipelineData, Range, ShellError, Signature, Spanned, SyntaxShape, Type, + Value, }; use rand::prelude::{thread_rng, Rng}; use std::cmp::Ordering; @@ -73,9 +74,12 @@ fn integer( call: &Call, ) -> Result { let span = call.head; - let range: Option = call.opt(engine_state, stack, 0)?; + let range: Option> = call.opt(engine_state, stack, 0)?; - let (min, max) = if let Some(r) = range { + let mut range_span = call.head; + let (min, max) = if let Some(spanned_range) = range { + let r = spanned_range.item; + range_span = spanned_range.span; if r.is_end_inclusive() { (r.from.as_int()?, r.to.as_int()?) } else if r.to.as_int()? > 0 { @@ -91,7 +95,7 @@ fn integer( Some(Ordering::Greater) => Err(ShellError::InvalidRange { left_flank: min.to_string(), right_flank: max.to_string(), - span, + span: range_span, }), Some(Ordering::Equal) => Ok(PipelineData::Value(Value::int(min, span), None)), _ => {