From 9b577b8679e182d0e89ecd06c2126e0381d79307 Mon Sep 17 00:00:00 2001 From: Jonathan Turner Date: Tue, 22 Sep 2020 05:28:31 +1200 Subject: [PATCH] Update bigint/bigdecimal (#2585) * Update bigint/bigdecimal * clippy --- Cargo.lock | 48 +++++++++++-------- crates/nu-cli/Cargo.toml | 10 ++-- .../src/commands/from_delimited_data.rs | 6 ++- crates/nu-cli/src/commands/from_json.rs | 3 +- crates/nu-cli/src/commands/from_ods.rs | 3 +- crates/nu-cli/src/commands/from_toml.rs | 3 +- crates/nu-cli/src/commands/from_xlsx.rs | 3 +- crates/nu-cli/src/commands/from_yaml.rs | 10 ++-- crates/nu-cli/src/commands/math/avg.rs | 6 ++- crates/nu-cli/src/commands/math/command.rs | 26 +++++----- crates/nu-cli/src/commands/math/eval.rs | 6 ++- crates/nu-cli/src/commands/math/median.rs | 6 ++- crates/nu-cli/src/commands/math/variance.rs | 12 ++++- crates/nu-cli/src/commands/str_/from.rs | 28 ++++++----- crates/nu-cli/src/commands/str_/to_decimal.rs | 4 +- crates/nu-data/Cargo.toml | 12 ++--- crates/nu-data/src/config.rs | 2 +- crates/nu-data/src/utils/internal.rs | 2 +- crates/nu-data/src/utils/mod.rs | 29 ++++++++--- crates/nu-errors/Cargo.toml | 8 ++-- crates/nu-parser/Cargo.toml | 6 +-- crates/nu-parser/src/parse.rs | 16 ++++--- crates/nu-plugin/Cargo.toml | 8 ++-- crates/nu-plugin/src/test_helpers.rs | 8 +++- crates/nu-protocol/Cargo.toml | 10 ++-- crates/nu-protocol/src/hir.rs | 14 +++++- crates/nu-protocol/src/value.rs | 19 +++++++- crates/nu_plugin_from_bson/Cargo.toml | 4 +- crates/nu_plugin_from_sqlite/Cargo.toml | 4 +- .../nu_plugin_from_sqlite/src/from_sqlite.rs | 20 ++++++-- crates/nu_plugin_ps/Cargo.toml | 4 +- crates/nu_plugin_ps/src/ps.rs | 5 +- crates/nu_plugin_sys/Cargo.toml | 4 +- crates/nu_plugin_sys/src/sys.rs | 44 ++++++++++++----- crates/nu_plugin_to_sqlite/Cargo.toml | 2 +- 35 files changed, 263 insertions(+), 132 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 480a89744a..84faa87f16 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -359,11 +359,11 @@ dependencies = [ [[package]] name = "bigdecimal" -version = "0.1.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1374191e2dd25f9ae02e3aa95041ed5d747fc77b3c102b49fe2dd9a8117a6244" +checksum = "cc403c26e6b03005522e6e8053384c4e881dfe5b2bf041c0c2c49be33d64a539" dependencies = [ - "num-bigint", + "num-bigint 0.3.0", "num-integer", "num-traits 0.2.12", "serde 1.0.115", @@ -2378,9 +2378,9 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.18.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e704a02bcaecd4a08b93a23f6be59d0bd79cd161e0963e9499165a0a35df7bd" +checksum = "e3a245984b1b06c291f46e27ebda9f369a94a1ab8461d0e845e23f9ced01f5db" dependencies = [ "cc", "pkg-config", @@ -2934,7 +2934,7 @@ dependencies = [ "nu-table", "nu-test-support", "nu-value-ext", - "num-bigint", + "num-bigint 0.3.0", "num-format", "num-traits 0.2.12", "parking_lot 0.11.0", @@ -2997,7 +2997,7 @@ dependencies = [ "nu-source", "nu-table", "nu-value-ext", - "num-bigint", + "num-bigint 0.3.0", "num-traits 0.2.12", "parking_lot 0.11.0", "query_interface", @@ -3017,7 +3017,7 @@ dependencies = [ "getset", "glob", "nu-source", - "num-bigint", + "num-bigint 0.3.0", "num-traits 0.2.12", "serde 1.0.115", "serde_json", @@ -3037,7 +3037,7 @@ dependencies = [ "nu-errors", "nu-protocol", "nu-source", - "num-bigint", + "num-bigint 0.3.0", "num-traits 0.2.12", "serde 1.0.115", "shellexpand", @@ -3053,7 +3053,7 @@ dependencies = [ "nu-protocol", "nu-source", "nu-value-ext", - "num-bigint", + "num-bigint 0.3.0", "serde 1.0.115", "serde_json", ] @@ -3075,7 +3075,7 @@ dependencies = [ "natural", "nu-errors", "nu-source", - "num-bigint", + "num-bigint 0.3.0", "num-integer", "num-traits 0.2.12", "serde 1.0.115", @@ -3238,7 +3238,7 @@ dependencies = [ "nu-plugin", "nu-protocol", "nu-source", - "num-bigint", + "num-bigint 0.3.0", ] [[package]] @@ -3278,7 +3278,7 @@ dependencies = [ "nu-plugin", "nu-protocol", "nu-source", - "num-bigint", + "num-bigint 0.3.0", ] [[package]] @@ -3342,7 +3342,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" dependencies = [ - "num-bigint", + "num-bigint 0.2.6", "num-complex", "num-integer", "num-iter", @@ -3355,6 +3355,17 @@ name = "num-bigint" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg 1.0.1", + "num-integer", + "num-traits 0.2.12", +] + +[[package]] +name = "num-bigint" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f3fc75e3697059fb1bc465e3d8cca6cf92f56854f201158b3f9c77d5a3cfa0" dependencies = [ "autocfg 1.0.1", "num-integer", @@ -3380,7 +3391,7 @@ checksum = "bafe4179722c2894288ee77a9f044f02811c86af699344c498b0840c698a2465" dependencies = [ "arrayvec 0.4.12", "itoa", - "num-bigint", + "num-bigint 0.2.6", ] [[package]] @@ -3411,7 +3422,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" dependencies = [ "autocfg 1.0.1", - "num-bigint", + "num-bigint 0.2.6", "num-integer", "num-traits 0.2.12", ] @@ -4395,9 +4406,9 @@ dependencies = [ [[package]] name = "rusqlite" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45d0fd62e1df63d254714e6cb40d0a0e82e7a1623e7a27f679d851af092ae58b" +checksum = "4c78c3275d9d6eb684d2db4b2388546b32fdae0586c20a82f3905d21ea78b9ef" dependencies = [ "bitflags", "fallible-iterator", @@ -4406,7 +4417,6 @@ dependencies = [ "lru-cache", "memchr", "smallvec 1.4.2", - "time", ] [[package]] diff --git a/crates/nu-cli/Cargo.toml b/crates/nu-cli/Cargo.toml index 3d30a03e8b..a684a99031 100644 --- a/crates/nu-cli/Cargo.toml +++ b/crates/nu-cli/Cargo.toml @@ -24,7 +24,7 @@ ansi_term = "0.12.1" async-recursion = "0.3.1" async-trait = "0.1.40" base64 = "0.12.3" -bigdecimal = {version = "0.1.2", features = ["serde"]} +bigdecimal = {version = "0.2.0", features = ["serde"]} byte-unit = "4.0.9" bytes = "0.5.6" calamine = "0.16.1" @@ -47,7 +47,7 @@ futures_codec = "0.4.1" getset = "0.1.1" git2 = {version = "0.13.11", default_features = false, optional = true} glob = "0.3.0" -heim = {version = "0.1.0-beta.3", optional = true } +heim = {version = "0.1.0-beta.3", optional = true} htmlescape = "0.3.1" ical = "0.6.0" ichwh = {version = "0.3.4", optional = true} @@ -56,7 +56,7 @@ itertools = "0.9.0" log = "0.4.11" meval = "0.2.0" natural = "0.5.0" -num-bigint = {version = "0.2.6", features = ["serde"]} +num-bigint = {version = "0.3.0", features = ["serde"]} num-format = {version = "0.4.0", features = ["with-num-bigint"]} num-traits = "0.2.12" parking_lot = "0.11.0" @@ -111,7 +111,7 @@ users = "0.10.0" [dependencies.rusqlite] features = ["bundled", "blob"] optional = true -version = "0.23.1" +version = "0.24.0" [build-dependencies] git2 = {version = "0.13.11", optional = true} @@ -122,7 +122,7 @@ quickcheck_macros = "0.9.1" [features] clipboard-cli = ["clipboard"] +rich-benchmark = ["heim"] rustyline-support = ["rustyline"] stable = [] trash-support = ["trash"] -rich-benchmark = ["heim"] diff --git a/crates/nu-cli/src/commands/from_delimited_data.rs b/crates/nu-cli/src/commands/from_delimited_data.rs index 152c7750ad..3e2c267302 100644 --- a/crates/nu-cli/src/commands/from_delimited_data.rs +++ b/crates/nu-cli/src/commands/from_delimited_data.rs @@ -14,6 +14,7 @@ fn from_delimited_string_to_value( .delimiter(separator as u8) .from_reader(s.as_bytes()); let tag = tag.into(); + let span = tag.span; let headers = if headerless { (1..=reader.headers()?.len()) @@ -30,7 +31,10 @@ fn from_delimited_string_to_value( if let Ok(i) = value.parse::() { tagged_row.insert_value(header, UntaggedValue::int(i).into_value(&tag)) } else if let Ok(f) = value.parse::() { - tagged_row.insert_value(header, UntaggedValue::decimal(f).into_value(&tag)) + tagged_row.insert_value( + header, + UntaggedValue::decimal_from_float(f, span).into_value(&tag), + ) } else { tagged_row.insert_value(header, UntaggedValue::string(value).into_value(&tag)) } diff --git a/crates/nu-cli/src/commands/from_json.rs b/crates/nu-cli/src/commands/from_json.rs index b94ca8fed3..fbd10502c1 100644 --- a/crates/nu-cli/src/commands/from_json.rs +++ b/crates/nu-cli/src/commands/from_json.rs @@ -39,11 +39,12 @@ impl WholeStreamCommand for FromJSON { fn convert_json_value_to_nu_value(v: &serde_hjson::Value, tag: impl Into) -> Value { let tag = tag.into(); + let span = tag.span; match v { serde_hjson::Value::Null => UntaggedValue::Primitive(Primitive::Nothing).into_value(&tag), serde_hjson::Value::Bool(b) => UntaggedValue::boolean(*b).into_value(&tag), - serde_hjson::Value::F64(n) => UntaggedValue::decimal(*n).into_value(&tag), + serde_hjson::Value::F64(n) => UntaggedValue::decimal_from_float(*n, span).into_value(&tag), serde_hjson::Value::U64(n) => UntaggedValue::int(*n).into_value(&tag), serde_hjson::Value::I64(n) => UntaggedValue::int(*n).into_value(&tag), serde_hjson::Value::String(s) => { diff --git a/crates/nu-cli/src/commands/from_ods.rs b/crates/nu-cli/src/commands/from_ods.rs index 138eed4b66..76839651bc 100644 --- a/crates/nu-cli/src/commands/from_ods.rs +++ b/crates/nu-cli/src/commands/from_ods.rs @@ -45,6 +45,7 @@ async fn from_ods( registry: &CommandRegistry, ) -> Result { let tag = args.call_info.name_tag.clone(); + let span = tag.span; let registry = registry.clone(); let ( @@ -73,7 +74,7 @@ async fn from_ods( let value = match cell { DataType::Empty => UntaggedValue::nothing(), DataType::String(s) => UntaggedValue::string(s), - DataType::Float(f) => UntaggedValue::decimal(*f), + DataType::Float(f) => UntaggedValue::decimal_from_float(*f, span), DataType::Int(i) => UntaggedValue::int(*i), DataType::Bool(b) => UntaggedValue::boolean(*b), _ => UntaggedValue::nothing(), diff --git a/crates/nu-cli/src/commands/from_toml.rs b/crates/nu-cli/src/commands/from_toml.rs index 2dffe9e813..e764e9e1df 100644 --- a/crates/nu-cli/src/commands/from_toml.rs +++ b/crates/nu-cli/src/commands/from_toml.rs @@ -30,11 +30,12 @@ impl WholeStreamCommand for FromTOML { pub fn convert_toml_value_to_nu_value(v: &toml::Value, tag: impl Into) -> Value { let tag = tag.into(); + let span = tag.span; match v { toml::Value::Boolean(b) => UntaggedValue::boolean(*b).into_value(tag), toml::Value::Integer(n) => UntaggedValue::int(*n).into_value(tag), - toml::Value::Float(n) => UntaggedValue::decimal(*n).into_value(tag), + toml::Value::Float(n) => UntaggedValue::decimal_from_float(*n, span).into_value(tag), toml::Value::String(s) => { UntaggedValue::Primitive(Primitive::String(String::from(s))).into_value(tag) } diff --git a/crates/nu-cli/src/commands/from_xlsx.rs b/crates/nu-cli/src/commands/from_xlsx.rs index f23c773bd5..0236823eef 100644 --- a/crates/nu-cli/src/commands/from_xlsx.rs +++ b/crates/nu-cli/src/commands/from_xlsx.rs @@ -45,6 +45,7 @@ async fn from_xlsx( registry: &CommandRegistry, ) -> Result { let tag = args.call_info.name_tag.clone(); + let span = tag.span; let registry = registry.clone(); let ( FromXLSXArgs { @@ -73,7 +74,7 @@ async fn from_xlsx( let value = match cell { DataType::Empty => UntaggedValue::nothing(), DataType::String(s) => UntaggedValue::string(s), - DataType::Float(f) => UntaggedValue::decimal(*f), + DataType::Float(f) => UntaggedValue::decimal_from_float(*f, span), DataType::Int(i) => UntaggedValue::int(*i), DataType::Bool(b) => UntaggedValue::boolean(*b), _ => UntaggedValue::nothing(), diff --git a/crates/nu-cli/src/commands/from_yaml.rs b/crates/nu-cli/src/commands/from_yaml.rs index bafb8bf17e..8ad72630bb 100644 --- a/crates/nu-cli/src/commands/from_yaml.rs +++ b/crates/nu-cli/src/commands/from_yaml.rs @@ -58,6 +58,7 @@ fn convert_yaml_value_to_nu_value( tag: impl Into, ) -> Result { let tag = tag.into(); + let span = tag.span; let err_not_compatible_number = ShellError::labeled_error( "Expected a compatible number", @@ -69,10 +70,11 @@ fn convert_yaml_value_to_nu_value( serde_yaml::Value::Number(n) if n.is_i64() => { UntaggedValue::int(n.as_i64().ok_or_else(|| err_not_compatible_number)?).into_value(tag) } - serde_yaml::Value::Number(n) if n.is_f64() => { - UntaggedValue::decimal(n.as_f64().ok_or_else(|| err_not_compatible_number)?) - .into_value(tag) - } + serde_yaml::Value::Number(n) if n.is_f64() => UntaggedValue::decimal_from_float( + n.as_f64().ok_or_else(|| err_not_compatible_number)?, + span, + ) + .into_value(tag), serde_yaml::Value::String(s) => UntaggedValue::string(s).into_value(tag), serde_yaml::Value::Sequence(a) => { let result: Result, ShellError> = a diff --git a/crates/nu-cli/src/commands/math/avg.rs b/crates/nu-cli/src/commands/math/avg.rs index c24841fb9a..c88b67e59c 100644 --- a/crates/nu-cli/src/commands/math/avg.rs +++ b/crates/nu-cli/src/commands/math/avg.rs @@ -53,7 +53,11 @@ impl WholeStreamCommand for SubCommand { vec![Example { description: "Get the average of a list of numbers", example: "echo [-50 100.0 25] | math avg", - result: Some(vec![UntaggedValue::decimal(25).into()]), + result: Some(vec![UntaggedValue::decimal_from_float( + 25.0, + Span::unknown(), + ) + .into()]), }] } } diff --git a/crates/nu-cli/src/commands/math/command.rs b/crates/nu-cli/src/commands/math/command.rs index 4fb9b422c8..6451b011f5 100644 --- a/crates/nu-cli/src/commands/math/command.rs +++ b/crates/nu-cli/src/commands/math/command.rs @@ -39,7 +39,7 @@ mod tests { sum::summation, utils::calculate, utils::MathFunction, variance::variance, }; use nu_plugin::row; - use nu_plugin::test_helpers::value::{decimal, int, table}; + use nu_plugin::test_helpers::value::{decimal, decimal_from_float, int, table}; use nu_protocol::Value; use std::str::FromStr; @@ -98,17 +98,17 @@ mod tests { }, TestCase { description: "Mixed Values", - values: vec![int(10), decimal(26.5), decimal(26.5)], + values: vec![int(10), decimal_from_float(26.5), decimal_from_float(26.5)], expected_err: None, expected_res: vec![ Ok(decimal(21)), Ok(int(10)), - Ok(decimal(26.5)), - Ok(decimal(26.5)), - Ok(table(&[decimal(26.5)])), + Ok(decimal_from_float(26.5)), + Ok(decimal_from_float(26.5)), + Ok(table(&[decimal_from_float(26.5)])), Ok(decimal(BigDecimal::from_str("7.77817459305202276840928798315333943213319531457321440247173855894902863154158871367713143880202865").expect("Could not convert to decimal from string"))), Ok(decimal(63)), - Ok(decimal(60.5)), + Ok(decimal_from_float(60.5)), ], }, TestCase { @@ -128,14 +128,14 @@ mod tests { }, TestCase { description: "Mixed Negative Values", - values: vec![decimal(-13.5), decimal(-11.5), int(10)], + values: vec![decimal_from_float(-13.5), decimal_from_float(-11.5), int(10)], expected_err: None, expected_res: vec![ Ok(decimal(-5)), - Ok(decimal(-13.5)), + Ok(decimal_from_float(-13.5)), Ok(int(10)), - Ok(decimal(-11.5)), - Ok(table(&[decimal(-13.5), decimal(-11.5), int(10)])), + Ok(decimal_from_float(-11.5)), + Ok(table(&[decimal_from_float(-13.5), decimal_from_float(-11.5), int(10)])), Ok(decimal(BigDecimal::from_str("10.63798226482196513098036125801342585449179971588207816421068645273754903468375890632981926875247027").expect("Could not convert to decimal from string"))), Ok(decimal(-15)), Ok(decimal(BigDecimal::from_str("113.1666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666667").expect("Could not convert to decimal from string"))), @@ -151,10 +151,10 @@ mod tests { ], expected_err: None, expected_res: vec![ - Ok(row!["col1".to_owned() => decimal(2.5), "col2".to_owned() => decimal(6.5)]), + Ok(row!["col1".to_owned() => decimal_from_float(2.5), "col2".to_owned() => decimal_from_float(6.5)]), Ok(row!["col1".to_owned() => int(1), "col2".to_owned() => int(5)]), Ok(row!["col1".to_owned() => int(4), "col2".to_owned() => int(8)]), - Ok(row!["col1".to_owned() => decimal(2.5), "col2".to_owned() => decimal(6.5)]), + Ok(row!["col1".to_owned() => decimal_from_float(2.5), "col2".to_owned() => decimal_from_float(6.5)]), Ok(row![ "col1".to_owned() => table(&[int(1), int(2), int(3), int(4)]), "col2".to_owned() => table(&[int(5), int(6), int(7), int(8)]) @@ -164,7 +164,7 @@ mod tests { "col2".to_owned() => decimal(BigDecimal::from_str("1.118033988749894848204586834365638117720309179805762862135448622705260462818902449707207204189391137").expect("Could not convert to decimal from string")) ]), Ok(row!["col1".to_owned() => int(10), "col2".to_owned() => int(26)]), - Ok(row!["col1".to_owned() => decimal(1.25), "col2".to_owned() => decimal(1.25)]), + Ok(row!["col1".to_owned() => decimal_from_float(1.25), "col2".to_owned() => decimal_from_float(1.25)]), ], }, // TODO-Uncomment once Issue: https://github.com/nushell/nushell/issues/1883 is resolved diff --git a/crates/nu-cli/src/commands/math/eval.rs b/crates/nu-cli/src/commands/math/eval.rs index 8c15466450..19ca87961d 100644 --- a/crates/nu-cli/src/commands/math/eval.rs +++ b/crates/nu-cli/src/commands/math/eval.rs @@ -41,7 +41,11 @@ impl WholeStreamCommand for SubCommand { vec![Example { description: "Evalulate math in the pipeline", example: "echo '10 / 4' | math eval", - result: Some(vec![UntaggedValue::decimal(2.5).into()]), + result: Some(vec![UntaggedValue::decimal_from_float( + 2.5, + Span::unknown(), + ) + .into()]), }] } } diff --git a/crates/nu-cli/src/commands/math/median.rs b/crates/nu-cli/src/commands/math/median.rs index d5f91b37f6..5eca61701d 100644 --- a/crates/nu-cli/src/commands/math/median.rs +++ b/crates/nu-cli/src/commands/math/median.rs @@ -50,7 +50,11 @@ impl WholeStreamCommand for SubCommand { vec![Example { description: "Get the median of a list of numbers", example: "echo [3 8 9 12 12 15] | math median", - result: Some(vec![UntaggedValue::decimal(10.5).into()]), + result: Some(vec![UntaggedValue::decimal_from_float( + 10.5, + Span::unknown(), + ) + .into()]), }] } } diff --git a/crates/nu-cli/src/commands/math/variance.rs b/crates/nu-cli/src/commands/math/variance.rs index 893632b836..c8bfa60021 100644 --- a/crates/nu-cli/src/commands/math/variance.rs +++ b/crates/nu-cli/src/commands/math/variance.rs @@ -99,12 +99,20 @@ impl WholeStreamCommand for SubCommand { Example { description: "Get the variance of a list of numbers", example: "echo [1 2 3 4 5] | math variance", - result: Some(vec![UntaggedValue::decimal(2).into()]), + result: Some(vec![UntaggedValue::decimal_from_float( + 2.0, + Span::unknown(), + ) + .into()]), }, Example { description: "Get the sample variance of a list of numbers", example: "echo [1 2 3 4 5] | math variance -s", - result: Some(vec![UntaggedValue::decimal(2.5).into()]), + result: Some(vec![UntaggedValue::decimal_from_float( + 2.5, + Span::unknown(), + ) + .into()]), }, ] } diff --git a/crates/nu-cli/src/commands/str_/from.rs b/crates/nu-cli/src/commands/str_/from.rs index fc2c5783d6..c1ee17d9bf 100644 --- a/crates/nu-cli/src/commands/str_/from.rs +++ b/crates/nu-cli/src/commands/str_/from.rs @@ -8,7 +8,7 @@ use nu_source::Tagged; use num_bigint::{BigInt, BigUint, ToBigInt}; // TODO num_format::SystemLocale once platform-specific dependencies are stable (see Cargo.toml) -use num_format::{Locale, ToFormattedString}; +use num_format::Locale; use num_traits::{Pow, Signed}; use std::iter; @@ -40,12 +40,15 @@ impl WholeStreamCommand for SubCommand { "decimal digits to which to round", Some('d'), ) - .switch( - "group-digits", - // TODO according to system localization - "group digits, currently by thousand with commas", - Some('g'), - ) + /* + FIXME: this isn't currently supported because of num_format being out of date. Once it's updated, re-enable this + .switch( + "group-digits", + // TODO according to system localization + "group digits, currently by thousand with commas", + Some('g'), + ) + */ } fn usage(&self) -> &str { @@ -67,6 +70,8 @@ impl WholeStreamCommand for SubCommand { example: "= 1.7 | str from -d 0", result: Some(vec![UntaggedValue::string("2").into_untagged_value()]), }, + /* + FIXME: this isn't currently supported because of num_format being out of date. Once it's updated, re-enable this Example { description: "format large number with localized digit grouping", example: "= 1000000.2 | str from -g", @@ -74,6 +79,7 @@ impl WholeStreamCommand for SubCommand { UntaggedValue::string("1,000,000.2").into_untagged_value() ]), }, + */ ] } } @@ -147,7 +153,7 @@ pub fn action( } fn format_bigint(int: &BigInt) -> String { - int.to_formatted_string(&Locale::en) + format!("{}", int) // TODO once platform-specific dependencies are stable (see Cargo.toml) // #[cfg(windows)] @@ -200,10 +206,8 @@ fn format_decimal(mut decimal: BigDecimal, digits: Option, group_digits: bo let format_default_loc = |int_part: BigInt| { let loc = Locale::en; - let (int_str, sep) = ( - int_part.to_formatted_string(&loc), - String::from(loc.decimal()), - ); + //TODO: when num_format is available for recent bigint, replace this with the locale-based format + let (int_str, sep) = (format!("{}", int_part), String::from(loc.decimal())); format!("{}{}{}", int_str, sep, dec_str) }; diff --git a/crates/nu-cli/src/commands/str_/to_decimal.rs b/crates/nu-cli/src/commands/str_/to_decimal.rs index ef63a444e7..ce8e06c12e 100644 --- a/crates/nu-cli/src/commands/str_/to_decimal.rs +++ b/crates/nu-cli/src/commands/str_/to_decimal.rs @@ -113,7 +113,7 @@ fn action(input: &Value, tag: impl Into) -> Result { #[cfg(test)] mod tests { use super::{action, SubCommand}; - use nu_plugin::test_helpers::value::{decimal, string}; + use nu_plugin::test_helpers::value::{decimal_from_float, string}; use nu_source::Tag; #[test] @@ -127,7 +127,7 @@ mod tests { #[allow(clippy::approx_constant)] fn turns_to_integer() { let word = string("3.1415"); - let expected = decimal(3.1415); + let expected = decimal_from_float(3.1415); let actual = action(&word, Tag::unknown()).unwrap(); assert_eq!(actual, expected); diff --git a/crates/nu-data/Cargo.toml b/crates/nu-data/Cargo.toml index a1d1286c34..5c270f4851 100644 --- a/crates/nu-data/Cargo.toml +++ b/crates/nu-data/Cargo.toml @@ -11,21 +11,21 @@ doctest = false [dependencies] ansi_term = "0.12.1" -bigdecimal = "0.1.2" +bigdecimal = "0.2.0" byte-unit = "4.0.9" chrono = "0.4.15" derive-new = "0.5.8" -directories = { version = "3.0.1", optional = true } -dirs = { version = "3.0.1", optional = true } +directories = {version = "3.0.1", optional = true} +dirs = {version = "3.0.1", optional = true} getset = "0.1.1" -indexmap = { version = "1.6.0", features = ["serde-1"] } +indexmap = {version = "1.6.0", features = ["serde-1"]} log = "0.4.11" -num-bigint = { version = "0.2.6", features = ["serde"] } +num-bigint = {version = "0.3.0", features = ["serde"]} num-traits = "0.2.12" parking_lot = "0.11.0" query_interface = "0.3.5" -serde = { version = "1.0.115", features = ["derive"] } +serde = {version = "1.0.115", features = ["derive"]} toml = "0.5.6" nu-errors = {version = "0.19.0", path = "../nu-errors"} diff --git a/crates/nu-data/src/config.rs b/crates/nu-data/src/config.rs index 52a18584a6..bfb186f705 100644 --- a/crates/nu-data/src/config.rs +++ b/crates/nu-data/src/config.rs @@ -24,7 +24,7 @@ pub fn convert_toml_value_to_nu_value(v: &toml::Value, tag: impl Into) -> V match v { toml::Value::Boolean(b) => UntaggedValue::boolean(*b).into_value(tag), toml::Value::Integer(n) => UntaggedValue::int(*n).into_value(tag), - toml::Value::Float(n) => UntaggedValue::decimal(*n).into_value(tag), + toml::Value::Float(n) => UntaggedValue::decimal_from_float(*n, tag.span).into_value(tag), toml::Value::String(s) => { UntaggedValue::Primitive(Primitive::String(String::from(s))).into_value(tag) } diff --git a/crates/nu-data/src/utils/internal.rs b/crates/nu-data/src/utils/internal.rs index fda8ddc9d1..946ecbec4a 100644 --- a/crates/nu-data/src/utils/internal.rs +++ b/crates/nu-data/src/utils/internal.rs @@ -253,7 +253,7 @@ pub fn percentages( &split .table_entries() .filter_map(|s| { - let hundred = UntaggedValue::decimal(100); + let hundred = UntaggedValue::decimal_from_float(100.0, tag.span); match compute_values(Operator::Divide, &hundred, &maxima) { Ok(v) => match compute_values(Operator::Multiply, &s, &v) { diff --git a/crates/nu-data/src/utils/mod.rs b/crates/nu-data/src/utils/mod.rs index 9ff2ab0aee..3f2b364c51 100644 --- a/crates/nu-data/src/utils/mod.rs +++ b/crates/nu-data/src/utils/mod.rs @@ -103,7 +103,7 @@ pub mod helpers { use indexmap::indexmap; use nu_errors::ShellError; use nu_protocol::{UntaggedValue, Value}; - use nu_source::{Tag, TaggedItem}; + use nu_source::{Span, Tag, TaggedItem}; use nu_value_ext::ValueExt; use num_bigint::BigInt; @@ -117,6 +117,10 @@ pub mod helpers { UntaggedValue::decimal(f.into()).into_untagged_value() } + pub fn decimal_from_float(f: f64, span: Span) -> Value { + UntaggedValue::decimal_from_float(f, span).into_untagged_value() + } + pub fn string(input: impl Into) -> Value { UntaggedValue::string(input.into()).into_untagged_value() } @@ -228,12 +232,13 @@ pub mod helpers { #[cfg(test)] mod tests { use super::helpers::{ - assert_without_checking_percentages, committers, date_formatter, decimal, int, table, + assert_without_checking_percentages, committers, date_formatter, decimal, + decimal_from_float, int, table, }; use super::{report, Labels, Model, Operation, Range}; use nu_errors::ShellError; use nu_protocol::Value; - use nu_source::{Tag, TaggedItem}; + use nu_source::{Span, Tag, TaggedItem}; use nu_value_ext::ValueExt; #[test] fn prepares_report_using_accumulating_value() { @@ -299,9 +304,21 @@ mod tests { table(&[int(2), int(6), int(12)]), ]), percentages: table(&[ - table(&[decimal(16.66), decimal(50), decimal(100)]), - table(&[decimal(8.33), decimal(25), decimal(50)]), - table(&[decimal(3.33), decimal(10), decimal(20)]), + table(&[ + decimal_from_float(16.66, Span::unknown()), + decimal(50), + decimal(100), + ]), + table(&[ + decimal_from_float(8.33, Span::unknown()), + decimal(25), + decimal(50), + ]), + table(&[ + decimal_from_float(3.33, Span::unknown()), + decimal(10), + decimal(20), + ]), ]), }, ); diff --git a/crates/nu-errors/Cargo.toml b/crates/nu-errors/Cargo.toml index 492431b108..a98fbb4655 100644 --- a/crates/nu-errors/Cargo.toml +++ b/crates/nu-errors/Cargo.toml @@ -13,13 +13,13 @@ doctest = false nu-source = {path = "../nu-source", version = "0.19.0"} ansi_term = "0.12.1" -bigdecimal = { version = "0.1.2", features = ["serde"] } -codespan-reporting = { version = "0.9.5", features = ["serialization"] } +bigdecimal = {version = "0.2.0", features = ["serde"]} +codespan-reporting = {version = "0.9.5", features = ["serialization"]} derive-new = "0.5.8" getset = "0.1.1" -num-bigint = { version = "0.2.6", features = ["serde"] } +num-bigint = {version = "0.3.0", features = ["serde"]} num-traits = "0.2.12" -serde = { version = "1.0.115", features = ["derive"] } +serde = {version = "1.0.115", features = ["derive"]} # implement conversions glob = "0.3.0" diff --git a/crates/nu-parser/Cargo.toml b/crates/nu-parser/Cargo.toml index acc78c36b6..9ef7a003a2 100644 --- a/crates/nu-parser/Cargo.toml +++ b/crates/nu-parser/Cargo.toml @@ -9,12 +9,12 @@ version = "0.19.0" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -bigdecimal = { version = "0.1.2", features = ["serde"] } +bigdecimal = {version = "0.2.0", features = ["serde"]} codespan-reporting = "0.9.5" derive-new = "0.5.8" -indexmap = { version = "1.6.0", features = ["serde-1"] } +indexmap = {version = "1.6.0", features = ["serde-1"]} log = "0.4.11" -num-bigint = { version = "0.2.6", features = ["serde"] } +num-bigint = {version = "0.3.0", features = ["serde"]} num-traits = "0.2.12" serde = "1.0.115" shellexpand = "2.0.0" diff --git a/crates/nu-parser/src/parse.rs b/crates/nu-parser/src/parse.rs index e8f6eb7074..2e35f89c97 100644 --- a/crates/nu-parser/src/parse.rs +++ b/crates/nu-parser/src/parse.rs @@ -741,10 +741,14 @@ fn parse_arg( None, ) } else if let Ok(x) = lite_arg.item.parse::() { - ( - SpannedExpression::new(Expression::decimal(x), lite_arg.span), - None, - ) + if let Ok(x) = Expression::decimal(x) { + (SpannedExpression::new(x, lite_arg.span), None) + } else { + ( + garbage(lite_arg.span), + Some(ParseError::mismatch("number", lite_arg.clone())), + ) + } } else { ( garbage(lite_arg.span), @@ -952,14 +956,14 @@ mod test { let registry = MockRegistry::new(); let result = parse_arg(SyntaxShape::Number, ®istry, &input); assert_eq!(result.1, None); - assert_eq!(result.0.expr, Expression::decimal(-32.2)); + assert_eq!(result.0.expr, Expression::decimal(-32.2)?); let raw = "32.2".to_string(); let input = raw.clone().spanned(Span::new(0, raw.len())); let registry = MockRegistry::new(); let result = parse_arg(SyntaxShape::Number, ®istry, &input); assert_eq!(result.1, None); - assert_eq!(result.0.expr, Expression::decimal(32.2)); + assert_eq!(result.0.expr, Expression::decimal(32.2)?); let raw = "-34".to_string(); let input = raw.clone().spanned(Span::new(0, raw.len())); diff --git a/crates/nu-plugin/Cargo.toml b/crates/nu-plugin/Cargo.toml index 83a0148206..52892f961c 100644 --- a/crates/nu-plugin/Cargo.toml +++ b/crates/nu-plugin/Cargo.toml @@ -15,10 +15,10 @@ nu-protocol = {path = "../nu-protocol", version = "0.19.0"} nu-source = {path = "../nu-source", version = "0.19.0"} nu-value-ext = {path = "../nu-value-ext", version = "0.19.0"} -bigdecimal = { version = "0.1.2", features = ["serde"] } -indexmap = { version = "1.6.0", features = ["serde-1"] } -num-bigint = { version = "0.2.6", features = ["serde"] } -serde = { version = "1.0.115", features = ["derive"] } +bigdecimal = {version = "0.2.0", features = ["serde"]} +indexmap = {version = "1.6.0", features = ["serde-1"]} +num-bigint = {version = "0.3.0", features = ["serde"]} +serde = {version = "1.0.115", features = ["derive"]} serde_json = "1.0.57" [build-dependencies] diff --git a/crates/nu-plugin/src/test_helpers.rs b/crates/nu-plugin/src/test_helpers.rs index d80b4cbdd1..6a9071093a 100644 --- a/crates/nu-plugin/src/test_helpers.rs +++ b/crates/nu-plugin/src/test_helpers.rs @@ -162,7 +162,7 @@ pub mod value { use bigdecimal::BigDecimal; use nu_errors::ShellError; use nu_protocol::{Primitive, TaggedDictBuilder, UntaggedValue, Value}; - use nu_source::Tag; + use nu_source::{Span, Tag}; use nu_value_ext::ValueExt; use num_bigint::BigInt; @@ -175,7 +175,11 @@ pub mod value { } pub fn decimal(f: impl Into) -> Value { - UntaggedValue::Primitive(Primitive::Decimal(f.into())).into_untagged_value() + UntaggedValue::decimal(f.into()).into_untagged_value() + } + + pub fn decimal_from_float(f: f64) -> Value { + UntaggedValue::decimal_from_float(f, Span::unknown()).into_untagged_value() } pub fn string(input: impl Into) -> Value { diff --git a/crates/nu-protocol/Cargo.toml b/crates/nu-protocol/Cargo.toml index 59c6889f7b..a229ea16eb 100644 --- a/crates/nu-protocol/Cargo.toml +++ b/crates/nu-protocol/Cargo.toml @@ -11,22 +11,22 @@ doctest = false [dependencies] ansi_term = "0.12.1" -bigdecimal = { version = "0.1.2", features = ["serde"] } +bigdecimal = {version = "0.2.0", features = ["serde"]} byte-unit = "4.0.9" -chrono = { version = "0.4.15", features = ["serde"] } +chrono = {version = "0.4.15", features = ["serde"]} codespan-reporting = "0.9.5" derive-new = "0.5.8" getset = "0.1.1" -indexmap = { version = "1.6.0", features = ["serde-1"] } +indexmap = {version = "1.6.0", features = ["serde-1"]} itertools = "0.9.0" log = "0.4.11" natural = "0.5.0" nu-errors = {path = "../nu-errors", version = "0.19.0"} nu-source = {path = "../nu-source", version = "0.19.0"} -num-bigint = { version = "0.2.6", features = ["serde"] } +num-bigint = {version = "0.3.0", features = ["serde"]} num-integer = "0.1.43" num-traits = "0.2.12" -serde = { version = "1.0.115", features = ["derive"] } +serde = {version = "1.0.115", features = ["derive"]} serde_bytes = "0.11.5" # implement conversions diff --git a/crates/nu-protocol/src/hir.rs b/crates/nu-protocol/src/hir.rs index 0b5386dfb2..9b72af37c2 100644 --- a/crates/nu-protocol/src/hir.rs +++ b/crates/nu-protocol/src/hir.rs @@ -1099,8 +1099,18 @@ impl Expression { Expression::Literal(Literal::Number(Number::Int(BigInt::from(i)))) } - pub fn decimal(f: f64) -> Expression { - Expression::Literal(Literal::Number(Number::Decimal(BigDecimal::from(f)))) + pub fn decimal(f: f64) -> Result { + let dec = BigDecimal::from_f64(f); + + let dec = match dec { + Some(x) => Ok(x), + None => Err(ParseError::internal_error( + "Can not convert f64 to big decimal" + .to_string() + .spanned_unknown(), + )), + }?; + Ok(Expression::Literal(Literal::Number(Number::Decimal(dec)))) } pub fn string(s: String) -> Expression { diff --git a/crates/nu-protocol/src/value.rs b/crates/nu-protocol/src/value.rs index 314e7a32c1..be4e2dba3b 100644 --- a/crates/nu-protocol/src/value.rs +++ b/crates/nu-protocol/src/value.rs @@ -17,6 +17,7 @@ use crate::value::primitive::Primitive; use crate::value::range::{Range, RangeInclusion}; use crate::{ColumnPath, PathMember, UnspannedPathMember}; use bigdecimal::BigDecimal; +use bigdecimal::FromPrimitive; use chrono::{DateTime, Utc}; use indexmap::IndexMap; use itertools::Itertools; @@ -190,8 +191,22 @@ impl UntaggedValue { } /// Helper for creating decimal values - pub fn decimal(s: impl Into) -> UntaggedValue { - UntaggedValue::Primitive(Primitive::Decimal(s.into())) + pub fn decimal(s: BigDecimal) -> UntaggedValue { + UntaggedValue::Primitive(Primitive::Decimal(s)) + } + + /// Helper for creating decimal values + pub fn decimal_from_float(f: f64, span: Span) -> UntaggedValue { + let dec = BigDecimal::from_f64(f); + + match dec { + Some(dec) => UntaggedValue::Primitive(Primitive::Decimal(dec)), + None => UntaggedValue::Error(ShellError::labeled_error( + "Can not convert f64 to big decimal", + "can not create decimal", + span, + )), + } } /// Helper for creating binary (non-text) buffer values diff --git a/crates/nu_plugin_from_bson/Cargo.toml b/crates/nu_plugin_from_bson/Cargo.toml index 77d32c0318..321f274545 100644 --- a/crates/nu_plugin_from_bson/Cargo.toml +++ b/crates/nu_plugin_from_bson/Cargo.toml @@ -10,8 +10,8 @@ version = "0.19.0" doctest = false [dependencies] -bigdecimal = "0.1.2" -bson = { version = "0.14.1", features = ["decimal128"] } +bigdecimal = "0.2.0" +bson = {version = "0.14.1", features = ["decimal128"]} nu-errors = {path = "../nu-errors", version = "0.19.0"} nu-plugin = {path = "../nu-plugin", version = "0.19.0"} nu-protocol = {path = "../nu-protocol", version = "0.19.0"} diff --git a/crates/nu_plugin_from_sqlite/Cargo.toml b/crates/nu_plugin_from_sqlite/Cargo.toml index 0525530f79..a3d8594cc2 100644 --- a/crates/nu_plugin_from_sqlite/Cargo.toml +++ b/crates/nu_plugin_from_sqlite/Cargo.toml @@ -10,7 +10,7 @@ version = "0.19.0" doctest = false [dependencies] -bigdecimal = "0.1.2" +bigdecimal = "0.2.0" nu-errors = {path = "../nu-errors", version = "0.19.0"} nu-plugin = {path = "../nu-plugin", version = "0.19.0"} nu-protocol = {path = "../nu-protocol", version = "0.19.0"} @@ -21,6 +21,6 @@ tempfile = "3.1.0" [dependencies.rusqlite] features = ["bundled", "blob"] -version = "0.23.1" +version = "0.24.0" [build-dependencies] diff --git a/crates/nu_plugin_from_sqlite/src/from_sqlite.rs b/crates/nu_plugin_from_sqlite/src/from_sqlite.rs index 238ca9b4f8..229cd80a47 100644 --- a/crates/nu_plugin_from_sqlite/src/from_sqlite.rs +++ b/crates/nu_plugin_from_sqlite/src/from_sqlite.rs @@ -1,3 +1,4 @@ +use bigdecimal::FromPrimitive; use nu_errors::ShellError; use nu_protocol::{Primitive, ReturnSuccess, ReturnValue, TaggedDictBuilder, UntaggedValue, Value}; use nu_source::Tag; @@ -58,9 +59,9 @@ fn convert_sqlite_row_to_nu_value( tag: impl Into + Clone, ) -> Result { let mut collected = TaggedDictBuilder::new(tag.clone()); - for (i, c) in row.columns().iter().enumerate() { + for (i, c) in row.column_names().iter().enumerate() { collected.insert_value( - c.name().to_string(), + c.to_string(), convert_sqlite_value_to_nu_value(row.get_raw(i), tag.clone()), ); } @@ -73,7 +74,20 @@ fn convert_sqlite_value_to_nu_value(value: ValueRef, tag: impl Into + Clone UntaggedValue::Primitive(Primitive::String(String::from(""))).into_value(tag) } ValueRef::Integer(i) => UntaggedValue::int(i).into_value(tag), - ValueRef::Real(f) => UntaggedValue::decimal(f).into_value(tag), + ValueRef::Real(f) => { + let f = bigdecimal::BigDecimal::from_f64(f); + let tag = tag.into(); + let span = tag.span; + match f { + Some(d) => UntaggedValue::decimal(d).into_value(tag), + None => UntaggedValue::Error(ShellError::labeled_error( + "Can not convert f64 to big decimal", + "can not convert to decimal", + span, + )) + .into_value(tag), + } + } ValueRef::Text(s) => { // this unwrap is safe because we know the ValueRef is Text. UntaggedValue::Primitive(Primitive::String(String::from_utf8_lossy(s).to_string())) diff --git a/crates/nu_plugin_ps/Cargo.toml b/crates/nu_plugin_ps/Cargo.toml index 8f7d5c48d2..7d0b3c19e2 100644 --- a/crates/nu_plugin_ps/Cargo.toml +++ b/crates/nu_plugin_ps/Cargo.toml @@ -15,9 +15,9 @@ nu-plugin = {path = "../nu-plugin", version = "0.19.0"} nu-protocol = {path = "../nu-protocol", version = "0.19.0"} nu-source = {path = "../nu-source", version = "0.19.0"} -num-bigint = "0.2.6" +num-bigint = "0.3.0" -futures = { version = "0.3.5", features = ["compat", "io-compat"] } +futures = {version = "0.3.5", features = ["compat", "io-compat"]} futures-timer = "3.0.2" [dependencies.heim] diff --git a/crates/nu_plugin_ps/src/ps.rs b/crates/nu_plugin_ps/src/ps.rs index 352028da87..3d7633e5b9 100644 --- a/crates/nu_plugin_ps/src/ps.rs +++ b/crates/nu_plugin_ps/src/ps.rs @@ -60,7 +60,10 @@ pub async fn ps(tag: Tag, long: bool) -> Result, ShellError> { if let Ok(status) = process.status().await { dict.insert_untagged("status", UntaggedValue::string(format!("{:?}", status))); } - dict.insert_untagged("cpu", UntaggedValue::decimal(usage.get::())); + dict.insert_untagged( + "cpu", + UntaggedValue::decimal_from_float(usage.get::() as f64, tag.span), + ); dict.insert_untagged( "mem", UntaggedValue::filesize(memory.rss().get::()), diff --git a/crates/nu_plugin_sys/Cargo.toml b/crates/nu_plugin_sys/Cargo.toml index b6ebc9dcda..3f822713e4 100644 --- a/crates/nu_plugin_sys/Cargo.toml +++ b/crates/nu_plugin_sys/Cargo.toml @@ -16,9 +16,9 @@ nu-protocol = {path = "../nu-protocol", version = "0.19.0"} nu-source = {path = "../nu-source", version = "0.19.0"} battery = "0.7.6" -futures = { version = "0.3.5", features = ["compat", "io-compat"] } +futures = {version = "0.3.5", features = ["compat", "io-compat"]} futures-util = "0.3.5" -num-bigint = "0.2.6" +num-bigint = "0.3.0" [dependencies.heim] default-features = false diff --git a/crates/nu_plugin_sys/src/sys.rs b/crates/nu_plugin_sys/src/sys.rs index 99651bcc5a..ceb94dde64 100644 --- a/crates/nu_plugin_sys/src/sys.rs +++ b/crates/nu_plugin_sys/src/sys.rs @@ -17,6 +17,7 @@ impl Sys { } async fn cpu(tag: Tag) -> Option { + let span = tag.span; match futures::future::try_join(heim::cpu::logical_count(), heim::cpu::frequency()).await { Ok((num_cpu, cpu_speed)) => { let mut cpu_idx = TaggedDictBuilder::with_capacity(tag, 4); @@ -26,20 +27,29 @@ async fn cpu(tag: Tag) -> Option { (cpu_speed.current().get::() as f64 / 1_000_000_000.0 * 100.0) .round() / 100.0; - cpu_idx.insert_untagged("current ghz", UntaggedValue::decimal(current_speed)); + cpu_idx.insert_untagged( + "current ghz", + UntaggedValue::decimal_from_float(current_speed, span), + ); if let Some(min_speed) = cpu_speed.min() { let min_speed = (min_speed.get::() as f64 / 1_000_000_000.0 * 100.0).round() / 100.0; - cpu_idx.insert_untagged("min ghz", UntaggedValue::decimal(min_speed)); + cpu_idx.insert_untagged( + "min ghz", + UntaggedValue::decimal_from_float(min_speed, span), + ); } if let Some(max_speed) = cpu_speed.max() { let max_speed = (max_speed.get::() as f64 / 1_000_000_000.0 * 100.0).round() / 100.0; - cpu_idx.insert_untagged("max ghz", UntaggedValue::decimal(max_speed)); + cpu_idx.insert_untagged( + "max ghz", + UntaggedValue::decimal_from_float(max_speed, span), + ); } Some(cpu_idx.into_value()) @@ -185,6 +195,7 @@ async fn disks(tag: Tag) -> Result, ShellError> { async fn battery(tag: Tag) -> Option { let mut output = vec![]; + let span = tag.span; if let Ok(manager) = battery::Manager::new() { if let Ok(batteries) = manager.batteries() { @@ -203,16 +214,18 @@ async fn battery(tag: Tag) -> Option { if let Some(time_to_full) = battery.time_to_full() { dict.insert_untagged( "mins to full", - UntaggedValue::decimal( - time_to_full.get::(), + UntaggedValue::decimal_from_float( + time_to_full.get::() as f64, + span, ), ); } if let Some(time_to_empty) = battery.time_to_empty() { dict.insert_untagged( "mins to empty", - UntaggedValue::decimal( - time_to_empty.get::(), + UntaggedValue::decimal_from_float( + time_to_empty.get::() as f64, + span, ), ); } @@ -231,6 +244,7 @@ async fn battery(tag: Tag) -> Option { async fn temp(tag: Tag) -> Option { let mut output = vec![]; + let span = tag.span; let sensors = sensors::temperatures(); @@ -245,23 +259,29 @@ async fn temp(tag: Tag) -> Option { } dict.insert_untagged( "temp", - UntaggedValue::decimal( + UntaggedValue::decimal_from_float( sensor .current() - .get::(), + .get::() + as f64, + span, ), ); if let Some(high) = sensor.high() { dict.insert_untagged( "high", - UntaggedValue::decimal(high.get::()), + UntaggedValue::decimal_from_float( + high.get::() as f64, + span, + ), ); } if let Some(critical) = sensor.critical() { dict.insert_untagged( "critical", - UntaggedValue::decimal( - critical.get::(), + UntaggedValue::decimal_from_float( + critical.get::() as f64, + span, ), ); } diff --git a/crates/nu_plugin_to_sqlite/Cargo.toml b/crates/nu_plugin_to_sqlite/Cargo.toml index ff1e498943..e5b2216e09 100644 --- a/crates/nu_plugin_to_sqlite/Cargo.toml +++ b/crates/nu_plugin_to_sqlite/Cargo.toml @@ -21,6 +21,6 @@ tempfile = "3.1.0" [dependencies.rusqlite] features = ["bundled", "blob"] -version = "0.23.1" +version = "0.24.0" [build-dependencies]