diff --git a/src/rust/Cargo.lock b/src/rust/Cargo.lock index 7134f2943..d0d9cc10e 100644 --- a/src/rust/Cargo.lock +++ b/src/rust/Cargo.lock @@ -576,8 +576,8 @@ checksum = "b90ca2580b73ab6a1f724b76ca11ab632df820fd6040c336200d2c1df7b3c82c" [[package]] name = "extendr-api" -version = "0.6.0" -source = "git+https://github.com/extendr/extendr?rev=1895bfc8ee22347665900caa0e48da4f0b13232f#1895bfc8ee22347665900caa0e48da4f0b13232f" +version = "0.7.0" +source = "git+https://github.com/extendr/extendr?rev=928aee2c3ee1b1fc5b0d4b449de3807da30ecd8f#928aee2c3ee1b1fc5b0d4b449de3807da30ecd8f" dependencies = [ "extendr-macros", "libR-sys", @@ -588,8 +588,8 @@ dependencies = [ [[package]] name = "extendr-macros" -version = "0.6.0" -source = "git+https://github.com/extendr/extendr?rev=1895bfc8ee22347665900caa0e48da4f0b13232f#1895bfc8ee22347665900caa0e48da4f0b13232f" +version = "0.7.0" +source = "git+https://github.com/extendr/extendr?rev=928aee2c3ee1b1fc5b0d4b449de3807da30ecd8f#928aee2c3ee1b1fc5b0d4b449de3807da30ecd8f" dependencies = [ "proc-macro2", "quote", @@ -1274,9 +1274,9 @@ dependencies = [ [[package]] name = "libR-sys" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a34aaa68a201f71eab5df5a67d1326add8aaf029434e939353bcab0534919ff1" +checksum = "44f2e4b6f402557010b557dd181842168db92da2c0d747bd091bd175941c570d" [[package]] name = "libc" @@ -2320,7 +2320,7 @@ dependencies = [ [[package]] name = "r-polars" -version = "0.41.0" +version = "0.41.1" dependencies = [ "either", "extendr-api", diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index 6b516f518..ffe83c8ed 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -36,7 +36,7 @@ opt-level = 3 # was 1 to support 1.66, but since 1.70 is needed anyway it does n opt-level = 3 [dependencies] -extendr-api = { git = "https://github.com/extendr/extendr", rev = "1895bfc8ee22347665900caa0e48da4f0b13232f", default-features = false, features = [ +extendr-api = { git = "https://github.com/extendr/extendr", rev = "928aee2c3ee1b1fc5b0d4b449de3807da30ecd8f", default-features = false, features = [ "result_list", "serde", ] } diff --git a/src/rust/src/arrow_interop/mod.rs b/src/rust/src/arrow_interop/mod.rs index 4aae05124..cb720df03 100644 --- a/src/rust/src/arrow_interop/mod.rs +++ b/src/rust/src/arrow_interop/mod.rs @@ -11,8 +11,9 @@ pub enum RArrowArrayClass { NanoArrowArray, } -impl<'a> FromRobj<'a> for RArrowArrayClass { - fn from_robj(robj: &Robj) -> std::result::Result { +impl TryFrom<&Robj> for RArrowArrayClass { + type Error = &'static str; + fn try_from(robj: &Robj) -> std::result::Result { if robj.inherits("nanoarrow_array") { Ok(RArrowArrayClass::NanoArrowArray) } else if robj.inherits("Array") { diff --git a/src/rust/src/arrow_interop/to_rust.rs b/src/rust/src/arrow_interop/to_rust.rs index 2dfe6ca1d..579c7a9c8 100644 --- a/src/rust/src/arrow_interop/to_rust.rs +++ b/src/rust/src/arrow_interop/to_rust.rs @@ -18,7 +18,7 @@ pub fn arrow_array_to_rust(arrow_array: Robj) -> Result { ) }; - RArrowArrayClass::from_robj(&arrow_array)? + RArrowArrayClass::try_from(&arrow_array)? .get_package() .get_export_array_func()? .call(pairlist!(&arrow_array, ext_a, ext_s))?; diff --git a/src/rust/src/conversion_r_to_s.rs b/src/rust/src/conversion_r_to_s.rs index 6335fb3ee..141e1ba4a 100644 --- a/src/rust/src/conversion_r_to_s.rs +++ b/src/rust/src/conversion_r_to_s.rs @@ -153,10 +153,11 @@ fn recursive_robjname2series_tree(x: &Robj, name: &str) -> pl::PolarsResult { - let rpolars_raw_list = list!(x) + let mut binding = list!(x); + let rpolars_raw_list = binding .set_class(["rpolars_raw_list", "list"]) .map_err(|err| pl::polars_err!(ComputeError: err.to_string()))?; - recursive_robjname2series_tree(&rpolars_raw_list, name) + recursive_robjname2series_tree(&rpolars_raw_list.clone().into_robj(), name) } Rtype::List if x.inherits("rpolars_raw_list") => { diff --git a/src/rust/src/conversion_s_to_r.rs b/src/rust/src/conversion_s_to_r.rs index 8199148e1..c23555238 100644 --- a/src/rust/src/conversion_s_to_r.rs +++ b/src/rust/src/conversion_s_to_r.rs @@ -49,6 +49,7 @@ pub fn pl_series_to_list( .collect_robj() .set_class(&["integer64"]) .expect("internal error could not set class label 'integer64'") + .clone() }), _ => Err(pl::PolarsError::InvalidOperation( "`int64_conversion ` must be one of 'float', 'string', 'bit64'".into(), @@ -109,6 +110,7 @@ pub fn pl_series_to_list( .into_robj() .set_class(["rpolars_raw_list", "list"]) .expect("this class label is always valid") + .clone() }), Enum(_, _) => s .categorical() @@ -181,7 +183,8 @@ pub fn pl_series_to_list( .into_iter() .collect_robj() .set_class(&["Date"]) - .expect("internal error: class label Date failed")), + .expect("internal error: class label Date failed") + .clone()), Null => Ok((extendr_api::NULL).into_robj()), Time => s .cast(&Int64)? @@ -195,8 +198,9 @@ pub fn pl_series_to_list( .map(|mut robj| { robj.set_class(&["PTime"]) .expect("internal error: class label PTime failed") + .clone() }) - .map(|mut robj| robj.set_attrib("tu", "ns")) + .map(|mut robj| robj.set_attrib("tu", "ns").cloned()) .expect("internal error: attr tu failed") .map_err(|err| { pl_error::ComputeError( @@ -248,9 +252,12 @@ pub fn pl_series_to_list( .map(|mut robj| { robj.set_class(&["POSIXct", "POSIXt"]) .expect("internal error: class POSIXct label failed") + .clone() }) .map(|mut robj| { - robj.set_attrib("tzone", opt_tz.as_ref().map(|s| s.as_str()).unwrap_or("")) + let res = robj + .set_attrib("tzone", opt_tz.as_ref().map(|s| s.as_str()).unwrap_or("")); + res.cloned() }) .expect("internal error: attr tzone failed") .map_err(|err| {