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
89macro_rules! ffi_to_polars {
90 ($to_ver:literal) => {
91 paste! {
92 impl Interchange {
93 #[doc = "Move Arrow data interchange format to Polars version `" $to_ver "`."]
94 pub fn [<to_polars_ $to_ver>](self) -> Result<[<polars_crate_ $to_ver>]::frame::DataFrame, InterchangeError> {
95
96 let num_cols = self.ffi.len();
98 let mut series = Vec::with_capacity(num_cols);
99
100 for s in self.ffi {
102
103 let num_chunks = s.1.len();
105 let mut chunks = Vec::with_capacity(num_chunks);
106
107 let name = s.0;
109
110 for c in s.1 {
112
113 let ffi_array = unsafe { transmute::<ArrowArray, [<polars_arrow_ $to_ver>]::ffi::ArrowArray>(c.0) };
115
116 let ffi_field = unsafe { transmute::<ArrowSchema, [<polars_arrow_ $to_ver>]::ffi::ArrowSchema>(c.1) };
118
119 let field = unsafe {
121 [<polars_arrow_ $to_ver>]::ffi::import_field_from_c(&ffi_field)
122 }?;
123
124 let array = unsafe {
126 [<polars_arrow_ $to_ver>]::ffi::import_array_from_c(ffi_array, field.data_type().clone(),
127 )
128 }?;
129
130 chunks.push(array);
132 }
133
134 series.push(
136 [<polars_crate_ $to_ver>]::series::Series::from_arrow_chunks(
137 &name,
138 chunks,
139 )?,
140 );
141 }
142
143 Ok([<polars_crate_ $to_ver>]::frame::DataFrame::from_iter(series))
145 }
146 }
147 }
148 };
149}
150
151#[cfg(feature = "polars_0_41")]
152ffi_to_polars!("0_41");
153
154#[cfg(feature = "polars_0_42")]
155ffi_to_polars!("0_42");
156
157macro_rules! ffi_to_polars {
158 ($to_ver:literal) => {
159 paste! {
160 impl Interchange {
161 #[doc = "Move Arrow data interchange format to Polars version `" $to_ver "`."]
162 pub fn [<to_polars_ $to_ver>](self) -> Result<[<polars_crate_ $to_ver>]::frame::DataFrame, InterchangeError> {
163
164 let num_cols = self.ffi.len();
166 let mut series = Vec::with_capacity(num_cols);
167
168 for s in self.ffi {
170
171 let num_chunks = s.1.len();
173 let mut chunks = Vec::with_capacity(num_chunks);
174
175 let name = s.0;
177
178 for c in s.1 {
180
181 let ffi_array = unsafe { transmute::<ArrowArray, [<polars_arrow_ $to_ver>]::ffi::ArrowArray>(c.0) };
183
184 let ffi_field = unsafe { transmute::<ArrowSchema, [<polars_arrow_ $to_ver>]::ffi::ArrowSchema>(c.1) };
186
187 let field = unsafe {
189 [<polars_arrow_ $to_ver>]::ffi::import_field_from_c(&ffi_field)
190 }?;
191
192 let array = unsafe {
194 [<polars_arrow_ $to_ver>]::ffi::import_array_from_c(ffi_array, field.data_type().clone(),
195 )
196 }?;
197
198 let series_chunk = [<polars_crate_ $to_ver>]::series::Series::from_arrow(
199 &name,
200 array,
201 )?;
202
203 chunks.push(series_chunk);
205 }
206
207 let mut chunk_iter = chunks.into_iter();
209 let mut full_series = chunk_iter.next().unwrap();
210 for c in chunk_iter {
211 full_series.append(&c)?;
212 }
213
214 series.push(
215 full_series,
216 );
217 }
218
219 Ok([<polars_crate_ $to_ver>]::frame::DataFrame::from_iter(series))
221 }
222 }
223 }
224 };
225}
226
227#[cfg(feature = "polars_0_40")]
228ffi_to_polars!("0_40");