mirror of
https://github.com/nushell/nushell.git
synced 2025-08-11 11:44:37 +02:00
Math operators (#1601)
* Add some math operations * WIP for adding compound expressions * precedence parsing * paren expressions * better lhs handling * add compound comparisons and shorthand lefthand parsing * Add or comparison and shorthand paths
This commit is contained in:
@ -41,7 +41,7 @@ pub enum Primitive {
|
||||
/// A date value, in UTC
|
||||
Date(DateTime<Utc>),
|
||||
/// A count in the number of seconds
|
||||
Duration(u64),
|
||||
Duration(i64),
|
||||
/// A range of values
|
||||
Range(Box<Range>),
|
||||
/// A file path
|
||||
@ -276,7 +276,7 @@ pub fn format_primitive(primitive: &Primitive, field_name: Option<&String>) -> S
|
||||
}
|
||||
|
||||
/// Format a duration in seconds into a string
|
||||
pub fn format_duration(sec: u64) -> String {
|
||||
pub fn format_duration(sec: i64) -> String {
|
||||
let (minutes, seconds) = (sec / 60, sec % 60);
|
||||
let (hours, minutes) = (minutes / 60, minutes % 60);
|
||||
let (days, hours) = (hours / 24, hours % 24);
|
||||
@ -290,13 +290,73 @@ pub fn format_duration(sec: u64) -> String {
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(clippy::cognitive_complexity)]
|
||||
/// Format a UTC date value into a humanized string (eg "1 week ago" instead of a formal date string)
|
||||
pub fn format_date(d: &DateTime<Utc>) -> String {
|
||||
let utc: DateTime<Utc> = Utc::now();
|
||||
|
||||
let duration = utc.signed_duration_since(*d);
|
||||
|
||||
if duration.num_weeks() >= 52 {
|
||||
if duration.num_seconds() < 0 {
|
||||
// Our duration is negative, so we need to speak about the future
|
||||
if -duration.num_weeks() >= 52 {
|
||||
let num_years = -duration.num_weeks() / 52;
|
||||
|
||||
format!(
|
||||
"{} year{} from now",
|
||||
num_years,
|
||||
if num_years == 1 { "" } else { "s" }
|
||||
)
|
||||
} else if -duration.num_weeks() >= 4 {
|
||||
let num_months = -duration.num_weeks() / 4;
|
||||
|
||||
format!(
|
||||
"{} month{} from now",
|
||||
num_months,
|
||||
if num_months == 1 { "" } else { "s" }
|
||||
)
|
||||
} else if -duration.num_weeks() >= 1 {
|
||||
let num_weeks = -duration.num_weeks();
|
||||
|
||||
format!(
|
||||
"{} week{} from now",
|
||||
num_weeks,
|
||||
if num_weeks == 1 { "" } else { "s" }
|
||||
)
|
||||
} else if -duration.num_days() >= 1 {
|
||||
let num_days = -duration.num_days();
|
||||
|
||||
format!(
|
||||
"{} day{} from now",
|
||||
num_days,
|
||||
if num_days == 1 { "" } else { "s" }
|
||||
)
|
||||
} else if -duration.num_hours() >= 1 {
|
||||
let num_hours = -duration.num_hours();
|
||||
|
||||
format!(
|
||||
"{} hour{} from now",
|
||||
num_hours,
|
||||
if num_hours == 1 { "" } else { "s" }
|
||||
)
|
||||
} else if -duration.num_minutes() >= 1 {
|
||||
let num_minutes = -duration.num_minutes();
|
||||
|
||||
format!(
|
||||
"{} min{} from now",
|
||||
num_minutes,
|
||||
if num_minutes == 1 { "" } else { "s" }
|
||||
)
|
||||
} else {
|
||||
let num_seconds = -duration.num_seconds();
|
||||
|
||||
format!(
|
||||
"{} sec{} from now",
|
||||
num_seconds,
|
||||
if num_seconds == 1 { "" } else { "s" }
|
||||
)
|
||||
}
|
||||
} else if duration.num_weeks() >= 52 {
|
||||
let num_years = duration.num_weeks() / 52;
|
||||
|
||||
format!(
|
||||
|
Reference in New Issue
Block a user