add into record command (#7225)

# Description

This command converts things into records.
<img width="466" alt="Screenshot 2022-11-24 at 2 10 54 PM"
src="https://user-images.githubusercontent.com/343840/203858104-0e4445da-9c37-4c7c-97ec-68ec3515bc4b.png">

<img width="716" alt="Screenshot 2022-11-24 at 5 04 11 PM"
src="https://user-images.githubusercontent.com/343840/203872621-48cab199-ba57-44fe-8f36-9e1469b9c4ef.png">



It also converts dates into record but I couldn't get the test harness
to accept an example.

Thanks to @WindSoilder for writing the "hard" parts of this. :)


_(Thank you for improving Nushell. Please, check our [contributing
guide](../CONTRIBUTING.md) and talk to the core team before making major
changes.)_

_(Description of your pull request goes here. **Provide examples and/or
screenshots** if your changes affect the user experience.)_

# User-Facing Changes

_(List of all changes that impact the user experience here. This helps
us keep track of breaking changes.)_

# Tests + Formatting

Don't forget to add tests that cover your changes.

Make sure you've run and fixed any issues with these commands:

- `cargo fmt --all -- --check` to check standard code formatting (`cargo
fmt --all` applies these changes)
- `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A
clippy::needless_collect` to check that you're using the standard code
style
- `cargo test --workspace` to check that all tests pass

# After Submitting

If your PR had any user-facing changes, update [the
documentation](https://github.com/nushell/nushell.github.io) after the
PR is merged, if necessary. This will help us keep the docs up to date.

Co-authored-by: WindSoilder <WindSoilder@outlook.com>
This commit is contained in:
Darren Schroeder
2022-11-26 09:00:47 -06:00
committed by GitHub
parent 2223fd663a
commit 3e76ed9122
4 changed files with 322 additions and 27 deletions

View File

@ -2968,7 +2968,7 @@ pub fn is_leap_year(year: i32) -> bool {
}
#[derive(Clone, Copy)]
enum TimePeriod {
pub enum TimePeriod {
Nanos(i64),
Micros(i64),
Millis(i64),
@ -2982,18 +2982,18 @@ enum TimePeriod {
}
impl TimePeriod {
fn to_text(self) -> Cow<'static, str> {
pub fn to_text(self) -> Cow<'static, str> {
match self {
Self::Nanos(n) => format!("{}ns", n).into(),
Self::Micros(n) => format!("{}µs", n).into(),
Self::Millis(n) => format!("{}ms", n).into(),
Self::Seconds(n) => format!("{}sec", n).into(),
Self::Minutes(n) => format!("{}min", n).into(),
Self::Hours(n) => format!("{}hr", n).into(),
Self::Days(n) => format!("{}day", n).into(),
Self::Weeks(n) => format!("{}wk", n).into(),
Self::Months(n) => format!("{}month", n).into(),
Self::Years(n) => format!("{}yr", n).into(),
Self::Nanos(n) => format!("{} ns", n).into(),
Self::Micros(n) => format!("{} µs", n).into(),
Self::Millis(n) => format!("{} ms", n).into(),
Self::Seconds(n) => format!("{} sec", n).into(),
Self::Minutes(n) => format!("{} min", n).into(),
Self::Hours(n) => format!("{} hr", n).into(),
Self::Days(n) => format!("{} day", n).into(),
Self::Weeks(n) => format!("{} wk", n).into(),
Self::Months(n) => format!("{} month", n).into(),
Self::Years(n) => format!("{} yr", n).into(),
}
}
}
@ -3005,6 +3005,21 @@ impl Display for TimePeriod {
}
pub fn format_duration(duration: i64) -> String {
let (sign, periods) = format_duration_as_timeperiod(duration);
let text = periods
.into_iter()
.map(|p| p.to_text().to_string().replace(' ', ""))
.collect::<Vec<String>>();
format!(
"{}{}",
if sign == -1 { "-" } else { "" },
text.join(" ").trim()
)
}
pub fn format_duration_as_timeperiod(duration: i64) -> (i32, Vec<TimePeriod>) {
// Attribution: most of this is taken from chrono-humanize-rs. Thanks!
// https://gitlab.com/imp/chrono-humanize-rs/-/blob/master/src/humantime.rs
const DAYS_IN_YEAR: i64 = 365;
@ -3151,21 +3166,7 @@ pub fn format_duration(duration: i64) -> String {
periods.push(TimePeriod::Seconds(0));
}
// let last = periods.pop().map(|last| last.to_text().to_string());
let text = periods
.into_iter()
.map(|p| p.to_text().to_string())
.collect::<Vec<String>>();
// if let Some(last) = last {
// text.push(format!("and {}", last));
// }
format!(
"{}{}",
if sign == -1 { "-" } else { "" },
text.join(" ").trim()
)
(sign, periods)
}
pub fn format_filesize_from_conf(num_bytes: i64, config: &Config) -> String {