Do some str collect cleanup (#312)

This commit is contained in:
JT
2021-11-09 17:46:26 +13:00
committed by GitHub
parent 47628946b6
commit 34617fabd9
12 changed files with 89 additions and 72 deletions

View File

@ -53,8 +53,8 @@ impl PipelineData {
pub fn collect_string(self) -> String {
match self {
PipelineData::Value(v) => v.collect_string(),
PipelineData::Stream(s) => s.collect_string(),
PipelineData::Value(v) => v.into_string("\n"),
PipelineData::Stream(s) => s.into_string("\n"),
}
}

View File

@ -87,14 +87,11 @@ impl Value {
pub fn as_string(&self) -> Result<String, ShellError> {
match self {
Value::String { val, .. } => Ok(val.to_string()),
x => {
println!("{:?}", x);
Err(ShellError::CantConvert(
"string".into(),
x.get_type().to_string(),
self.span()?,
))
}
x => Err(ShellError::CantConvert(
"string".into(),
x.get_type().to_string(),
self.span()?,
)),
}
}
@ -166,7 +163,7 @@ impl Value {
}
/// Convert Value into string. Note that Streams will be consumed.
pub fn into_string(self) -> String {
pub fn into_string(self, separator: &str) -> String {
match self {
Value::Bool { val, .. } => val.to_string(),
Value::Int { val, .. } => val.to_string(),
@ -175,23 +172,27 @@ impl Value {
Value::Duration { val, .. } => format_duration(val),
Value::Date { val, .. } => HumanTime::from(val).to_string(),
Value::Range { val, .. } => {
format!("{}..{}", val.from.into_string(), val.to.into_string())
format!(
"{}..{}",
val.from.into_string(", "),
val.to.into_string(", ")
)
}
Value::String { val, .. } => val,
Value::List { vals: val, .. } => format!(
"[{}]",
val.into_iter()
.map(|x| x.into_string())
.map(|x| x.into_string(", "))
.collect::<Vec<_>>()
.join(", ")
.join(separator)
),
Value::Record { cols, vals, .. } => format!(
"{{{}}}",
cols.iter()
.zip(vals.iter())
.map(|(x, y)| format!("{}: {}", x, y.clone().into_string()))
.map(|(x, y)| format!("{}: {}", x, y.clone().into_string(", ")))
.collect::<Vec<_>>()
.join(", ")
.join(separator)
),
Value::Block { val, .. } => format!("<Block {}>", val),
Value::Nothing { .. } => String::new(),
@ -201,7 +202,8 @@ impl Value {
}
}
pub fn collect_string(self) -> String {
/// Convert Value into string. Note that Streams will be consumed.
pub fn debug_string(self, separator: &str) -> String {
match self {
Value::Bool { val, .. } => val.to_string(),
Value::Int { val, .. } => val.to_string(),
@ -210,24 +212,33 @@ impl Value {
Value::Duration { val, .. } => format_duration(val),
Value::Date { val, .. } => format!("{:?}", val),
Value::Range { val, .. } => {
format!("{}..{}", val.from.into_string(), val.to.into_string())
format!(
"{}..{}",
val.from.into_string(", "),
val.to.into_string(", ")
)
}
Value::String { val, .. } => val,
Value::List { vals: val, .. } => val
.into_iter()
.map(|x| x.collect_string())
.collect::<Vec<_>>()
.join("\n"),
Value::Record { vals, .. } => vals
.into_iter()
.map(|y| y.collect_string())
.collect::<Vec<_>>()
.join("\n"),
Value::List { vals: val, .. } => format!(
"[{}]",
val.into_iter()
.map(|x| x.into_string(", "))
.collect::<Vec<_>>()
.join(separator)
),
Value::Record { cols, vals, .. } => format!(
"{{{}}}",
cols.iter()
.zip(vals.iter())
.map(|(x, y)| format!("{}: {}", x, y.clone().into_string(", ")))
.collect::<Vec<_>>()
.join(separator)
),
Value::Block { val, .. } => format!("<Block {}>", val),
Value::Nothing { .. } => String::new(),
Value::Error { error } => format!("{:?}", error),
Value::Binary { val, .. } => format!("{:?}", val),
Value::CellPath { .. } => self.into_string(),
Value::CellPath { val, .. } => val.into_string(),
}
}
@ -534,6 +545,15 @@ impl Value {
val: lhs.to_string() + rhs,
span,
}),
(Value::Date { val: lhs, .. }, Value::Duration { val: rhs, .. }) => {
match lhs.checked_add_signed(chrono::Duration::nanoseconds(*rhs)) {
Some(val) => Ok(Value::Date { val, span }),
_ => Err(ShellError::OperatorOverflow(
"addition operation overflowed".into(),
span,
)),
}
}
(Value::Duration { val: lhs, .. }, Value::Duration { val: rhs, .. }) => {
if let Some(val) = lhs.checked_add(*rhs) {
Ok(Value::Duration { val, span })
@ -590,6 +610,15 @@ impl Value {
val: lhs - rhs,
span,
}),
(Value::Date { val: lhs, .. }, Value::Duration { val: rhs, .. }) => {
match lhs.checked_sub_signed(chrono::Duration::nanoseconds(*rhs)) {
Some(val) => Ok(Value::Date { val, span }),
_ => Err(ShellError::OperatorOverflow(
"subtraction operation overflowed".into(),
span,
)),
}
}
(Value::Duration { val: lhs, .. }, Value::Duration { val: rhs, .. }) => {
if let Some(val) = lhs.checked_sub(*rhs) {
Ok(Value::Duration { val, span })

View File

@ -16,7 +16,7 @@ impl RowStream {
.join(", "),
self.map(|x: Vec<Value>| {
x.into_iter()
.map(|x| x.into_string())
.map(|x| x.into_string(", "))
.collect::<Vec<String>>()
.join(", ")
})

View File

@ -19,21 +19,15 @@ pub struct ValueStream {
}
impl ValueStream {
pub fn into_string(self) -> String {
pub fn into_string(self, separator: &str) -> String {
format!(
"[{}]",
self.map(|x: Value| x.into_string())
self.map(|x: Value| x.into_string(", "))
.collect::<Vec<String>>()
.join(", ")
.join(separator)
)
}
pub fn collect_string(self) -> String {
self.map(|x: Value| x.collect_string())
.collect::<Vec<String>>()
.join("\n")
}
pub fn from_stream(
input: impl Iterator<Item = Value> + Send + 'static,
ctrlc: Option<Arc<AtomicBool>>,