df_interchange/
to_polars.rs1use paste::paste;
2use std::mem::transmute;
3
4use crate::{error::InterchangeError, ArrowArray, ArrowSchema, Interchange};
5
6macro_rules! ffi_to_polars {
7 ($to_ver:literal) => {
8 paste! {
9 impl Interchange {
10 #[doc = "Move Arrow data interchange format to Polars version `" $to_ver "`."]
11 pub fn [<to_polars_ $to_ver>](self) -> Result<[<polars_crate_ $to_ver>]::frame::DataFrame, InterchangeError> {
12
13 let num_cols = self.ffi.len();
15 let mut series = Vec::with_capacity(num_cols);
16
17 for s in self.ffi {
19
20 let num_chunks = s.1.len();
22 let mut chunks = Vec::with_capacity(num_chunks);
23
24 let name = s.0;
26
27 for c in s.1 {
29
30 let ffi_array = unsafe { transmute::<ArrowArray, [<polars_arrow_ $to_ver>]::ffi::ArrowArray>(c.0) };
32
33 let ffi_field = unsafe { transmute::<ArrowSchema, [<polars_arrow_ $to_ver>]::ffi::ArrowSchema>(c.1) };
35
36 let field = unsafe {
38 [<polars_arrow_ $to_ver>]::ffi::import_field_from_c(&ffi_field)
39 }?;
40
41 let array = unsafe {
43 [<polars_arrow_ $to_ver>]::ffi::import_array_from_c(ffi_array, field.dtype().clone(),
44 )
45 }?;
46
47 chunks.push(array);
49 }
50
51 series.push(
53 [<polars_crate_ $to_ver>]::series::Series::from_arrow_chunks(
54 name.into(),
55 chunks,
56 )?,
57 );
58 }
59
60 Ok([<polars_crate_ $to_ver>]::frame::DataFrame::from_iter(series))
62 }
63 }
64 }
65 };
66}
67
68#[cfg(feature = "polars_0_43")]
69ffi_to_polars!("0_43");
70
71#[cfg(feature = "polars_0_44")]
72ffi_to_polars!("0_44");
73
74#[cfg(feature = "polars_0_45")]
75ffi_to_polars!("0_45");
76
77#[cfg(feature = "polars_0_46")]
78ffi_to_polars!("0_46");
79
80#[cfg(feature = "polars_0_47")]
81ffi_to_polars!("0_47");
82
83#[cfg(feature = "polars_0_48")]
84ffi_to_polars!("0_48");
85
86#[cfg(feature = "polars_0_49")]
87ffi_to_polars!("0_49");
88
89#[cfg(feature = "polars_0_50")]
90ffi_to_polars!("0_50");
91
92#[cfg(feature = "polars_0_51")]
93ffi_to_polars!("0_51");
94
95#[cfg(feature = "polars_0_52")]
96ffi_to_polars!("0_52");
97
98macro_rules! ffi_to_polars {
99 ($to_ver:literal) => {
100 paste! {
101 impl Interchange {
102 #[doc = "Move Arrow data interchange format to Polars version `" $to_ver "`."]
103 pub fn [<to_polars_ $to_ver>](self) -> Result<[<polars_crate_ $to_ver>]::frame::DataFrame, InterchangeError> {
104
105 let num_cols = self.ffi.len();
107 let mut series = Vec::with_capacity(num_cols);
108
109 for s in self.ffi {
111
112 let num_chunks = s.1.len();
114 let mut chunks = Vec::with_capacity(num_chunks);
115
116 let name = s.0;
118
119 for c in s.1 {
121
122 let ffi_array = unsafe { transmute::<ArrowArray, [<polars_arrow_ $to_ver>]::ffi::ArrowArray>(c.0) };
124
125 let ffi_field = unsafe { transmute::<ArrowSchema, [<polars_arrow_ $to_ver>]::ffi::ArrowSchema>(c.1) };
127
128 let field = unsafe {
130 [<polars_arrow_ $to_ver>]::ffi::import_field_from_c(&ffi_field)
131 }?;
132
133 let array = unsafe {
135 [<polars_arrow_ $to_ver>]::ffi::import_array_from_c(ffi_array, field.data_type().clone(),
136 )
137 }?;
138
139 chunks.push(array);
141 }
142
143 series.push(
145 [<polars_crate_ $to_ver>]::series::Series::from_arrow_chunks(
146 &name,
147 chunks,
148 )?,
149 );
150 }
151
152 Ok([<polars_crate_ $to_ver>]::frame::DataFrame::from_iter(series))
154 }
155 }
156 }
157 };
158}
159
160#[cfg(feature = "polars_0_41")]
161ffi_to_polars!("0_41");
162
163#[cfg(feature = "polars_0_42")]
164ffi_to_polars!("0_42");
165
166macro_rules! ffi_to_polars {
167 ($to_ver:literal) => {
168 paste! {
169 impl Interchange {
170 #[doc = "Move Arrow data interchange format to Polars version `" $to_ver "`."]
171 pub fn [<to_polars_ $to_ver>](self) -> Result<[<polars_crate_ $to_ver>]::frame::DataFrame, InterchangeError> {
172
173 let num_cols = self.ffi.len();
175 let mut series = Vec::with_capacity(num_cols);
176
177 for s in self.ffi {
179
180 let num_chunks = s.1.len();
182 let mut chunks = Vec::with_capacity(num_chunks);
183
184 let name = s.0;
186
187 for c in s.1 {
189
190 let ffi_array = unsafe { transmute::<ArrowArray, [<polars_arrow_ $to_ver>]::ffi::ArrowArray>(c.0) };
192
193 let ffi_field = unsafe { transmute::<ArrowSchema, [<polars_arrow_ $to_ver>]::ffi::ArrowSchema>(c.1) };
195
196 let field = unsafe {
198 [<polars_arrow_ $to_ver>]::ffi::import_field_from_c(&ffi_field)
199 }?;
200
201 let array = unsafe {
203 [<polars_arrow_ $to_ver>]::ffi::import_array_from_c(ffi_array, field.data_type().clone(),
204 )
205 }?;
206
207 let series_chunk = [<polars_crate_ $to_ver>]::series::Series::from_arrow(
208 &name,
209 array,
210 )?;
211
212 chunks.push(series_chunk);
214 }
215
216 let mut chunk_iter = chunks.into_iter();
218 let mut full_series = chunk_iter.next().unwrap();
219 for c in chunk_iter {
220 full_series.append(&c)?;
221 }
222
223 series.push(
224 full_series,
225 );
226 }
227
228 Ok([<polars_crate_ $to_ver>]::frame::DataFrame::from_iter(series))
230 }
231 }
232 }
233 };
234}
235
236#[cfg(feature = "polars_0_40")]
237ffi_to_polars!("0_40");