Skip to content

Commit fe27928

Browse files
committed
glib: add TryFromGlib traits for Container
C containers can be NULL, which is represented by None in Rust. This commit: * adds container specific `TryFromGlib` traits which return an Option, * implements them for the existing containers, * base the container specific `FromGlib` implementations off the `TryFromGlib` implementations.
1 parent 02804a4 commit fe27928

File tree

8 files changed

+1225
-316
lines changed

8 files changed

+1225
-316
lines changed

glib/src/auto/date_time.rs

Lines changed: 66 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ impl DateTime {
2727
seconds: f64,
2828
) -> Result<DateTime, BoolError> {
2929
unsafe {
30-
Option::<_>::from_glib_full(ffi::g_date_time_new(
30+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new(
3131
tz.to_glib_none().0,
3232
year,
3333
month,
@@ -44,7 +44,7 @@ impl DateTime {
4444
#[doc(alias = "new_from_iso8601")]
4545
pub fn from_iso8601(text: &str, default_tz: Option<&TimeZone>) -> Result<DateTime, BoolError> {
4646
unsafe {
47-
Option::<_>::from_glib_full(ffi::g_date_time_new_from_iso8601(
47+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new_from_iso8601(
4848
text.to_glib_none().0,
4949
default_tz.to_glib_none().0,
5050
))
@@ -72,8 +72,10 @@ impl DateTime {
7272
#[doc(alias = "new_from_unix_local")]
7373
pub fn from_unix_local(t: i64) -> Result<DateTime, BoolError> {
7474
unsafe {
75-
Option::<_>::from_glib_full(ffi::g_date_time_new_from_unix_local(t))
76-
.ok_or_else(|| crate::bool_error!("Invalid date"))
75+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new_from_unix_local(
76+
t,
77+
))
78+
.ok_or_else(|| crate::bool_error!("Invalid date"))
7779
}
7880
}
7981

@@ -83,16 +85,18 @@ impl DateTime {
8385
#[doc(alias = "new_from_unix_local_usec")]
8486
pub fn from_unix_local_usec(usecs: i64) -> Result<DateTime, BoolError> {
8587
unsafe {
86-
Option::<_>::from_glib_full(ffi::g_date_time_new_from_unix_local_usec(usecs))
87-
.ok_or_else(|| crate::bool_error!("Invalid date"))
88+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(
89+
ffi::g_date_time_new_from_unix_local_usec(usecs),
90+
)
91+
.ok_or_else(|| crate::bool_error!("Invalid date"))
8892
}
8993
}
9094

9195
#[doc(alias = "g_date_time_new_from_unix_utc")]
9296
#[doc(alias = "new_from_unix_utc")]
9397
pub fn from_unix_utc(t: i64) -> Result<DateTime, BoolError> {
9498
unsafe {
95-
Option::<_>::from_glib_full(ffi::g_date_time_new_from_unix_utc(t))
99+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new_from_unix_utc(t))
96100
.ok_or_else(|| crate::bool_error!("Invalid date"))
97101
}
98102
}
@@ -103,8 +107,10 @@ impl DateTime {
103107
#[doc(alias = "new_from_unix_utc_usec")]
104108
pub fn from_unix_utc_usec(usecs: i64) -> Result<DateTime, BoolError> {
105109
unsafe {
106-
Option::<_>::from_glib_full(ffi::g_date_time_new_from_unix_utc_usec(usecs))
107-
.ok_or_else(|| crate::bool_error!("Invalid date"))
110+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(
111+
ffi::g_date_time_new_from_unix_utc_usec(usecs),
112+
)
113+
.ok_or_else(|| crate::bool_error!("Invalid date"))
108114
}
109115
}
110116

@@ -119,7 +125,7 @@ impl DateTime {
119125
seconds: f64,
120126
) -> Result<DateTime, BoolError> {
121127
unsafe {
122-
Option::<_>::from_glib_full(ffi::g_date_time_new_local(
128+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new_local(
123129
year, month, day, hour, minute, seconds,
124130
))
125131
.ok_or_else(|| crate::bool_error!("Invalid date"))
@@ -130,16 +136,18 @@ impl DateTime {
130136
#[doc(alias = "new_now")]
131137
pub fn now(tz: &TimeZone) -> Result<DateTime, BoolError> {
132138
unsafe {
133-
Option::<_>::from_glib_full(ffi::g_date_time_new_now(tz.to_glib_none().0))
134-
.ok_or_else(|| crate::bool_error!("Invalid date"))
139+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new_now(
140+
tz.to_glib_none().0,
141+
))
142+
.ok_or_else(|| crate::bool_error!("Invalid date"))
135143
}
136144
}
137145

138146
#[doc(alias = "g_date_time_new_now_local")]
139147
#[doc(alias = "new_now_local")]
140148
pub fn now_local() -> Result<DateTime, BoolError> {
141149
unsafe {
142-
Option::<_>::from_glib_full(ffi::g_date_time_new_now_local())
150+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new_now_local())
143151
.ok_or_else(|| crate::bool_error!("Invalid date"))
144152
}
145153
}
@@ -148,7 +156,7 @@ impl DateTime {
148156
#[doc(alias = "new_now_utc")]
149157
pub fn now_utc() -> Result<DateTime, BoolError> {
150158
unsafe {
151-
Option::<_>::from_glib_full(ffi::g_date_time_new_now_utc())
159+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new_now_utc())
152160
.ok_or_else(|| crate::bool_error!("Invalid date"))
153161
}
154162
}
@@ -164,7 +172,7 @@ impl DateTime {
164172
seconds: f64,
165173
) -> Result<DateTime, BoolError> {
166174
unsafe {
167-
Option::<_>::from_glib_full(ffi::g_date_time_new_utc(
175+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_new_utc(
168176
year, month, day, hour, minute, seconds,
169177
))
170178
.ok_or_else(|| crate::bool_error!("Invalid date"))
@@ -174,7 +182,7 @@ impl DateTime {
174182
#[doc(alias = "g_date_time_add")]
175183
pub fn add(&self, timespan: TimeSpan) -> Result<DateTime, BoolError> {
176184
unsafe {
177-
Option::<_>::from_glib_full(ffi::g_date_time_add(
185+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add(
178186
self.to_glib_none().0,
179187
timespan.into_glib(),
180188
))
@@ -185,8 +193,11 @@ impl DateTime {
185193
#[doc(alias = "g_date_time_add_days")]
186194
pub fn add_days(&self, days: i32) -> Result<DateTime, BoolError> {
187195
unsafe {
188-
Option::<_>::from_glib_full(ffi::g_date_time_add_days(self.to_glib_none().0, days))
189-
.ok_or_else(|| crate::bool_error!("Invalid date"))
196+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add_days(
197+
self.to_glib_none().0,
198+
days,
199+
))
200+
.ok_or_else(|| crate::bool_error!("Invalid date"))
190201
}
191202
}
192203

@@ -201,7 +212,7 @@ impl DateTime {
201212
seconds: f64,
202213
) -> Result<DateTime, BoolError> {
203214
unsafe {
204-
Option::<_>::from_glib_full(ffi::g_date_time_add_full(
215+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add_full(
205216
self.to_glib_none().0,
206217
years,
207218
months,
@@ -217,15 +228,18 @@ impl DateTime {
217228
#[doc(alias = "g_date_time_add_hours")]
218229
pub fn add_hours(&self, hours: i32) -> Result<DateTime, BoolError> {
219230
unsafe {
220-
Option::<_>::from_glib_full(ffi::g_date_time_add_hours(self.to_glib_none().0, hours))
221-
.ok_or_else(|| crate::bool_error!("Invalid date"))
231+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add_hours(
232+
self.to_glib_none().0,
233+
hours,
234+
))
235+
.ok_or_else(|| crate::bool_error!("Invalid date"))
222236
}
223237
}
224238

225239
#[doc(alias = "g_date_time_add_minutes")]
226240
pub fn add_minutes(&self, minutes: i32) -> Result<DateTime, BoolError> {
227241
unsafe {
228-
Option::<_>::from_glib_full(ffi::g_date_time_add_minutes(
242+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add_minutes(
229243
self.to_glib_none().0,
230244
minutes,
231245
))
@@ -236,15 +250,18 @@ impl DateTime {
236250
#[doc(alias = "g_date_time_add_months")]
237251
pub fn add_months(&self, months: i32) -> Result<DateTime, BoolError> {
238252
unsafe {
239-
Option::<_>::from_glib_full(ffi::g_date_time_add_months(self.to_glib_none().0, months))
240-
.ok_or_else(|| crate::bool_error!("Invalid date"))
253+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add_months(
254+
self.to_glib_none().0,
255+
months,
256+
))
257+
.ok_or_else(|| crate::bool_error!("Invalid date"))
241258
}
242259
}
243260

244261
#[doc(alias = "g_date_time_add_seconds")]
245262
pub fn add_seconds(&self, seconds: f64) -> Result<DateTime, BoolError> {
246263
unsafe {
247-
Option::<_>::from_glib_full(ffi::g_date_time_add_seconds(
264+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add_seconds(
248265
self.to_glib_none().0,
249266
seconds,
250267
))
@@ -255,16 +272,22 @@ impl DateTime {
255272
#[doc(alias = "g_date_time_add_weeks")]
256273
pub fn add_weeks(&self, weeks: i32) -> Result<DateTime, BoolError> {
257274
unsafe {
258-
Option::<_>::from_glib_full(ffi::g_date_time_add_weeks(self.to_glib_none().0, weeks))
259-
.ok_or_else(|| crate::bool_error!("Invalid date"))
275+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add_weeks(
276+
self.to_glib_none().0,
277+
weeks,
278+
))
279+
.ok_or_else(|| crate::bool_error!("Invalid date"))
260280
}
261281
}
262282

263283
#[doc(alias = "g_date_time_add_years")]
264284
pub fn add_years(&self, years: i32) -> Result<DateTime, BoolError> {
265285
unsafe {
266-
Option::<_>::from_glib_full(ffi::g_date_time_add_years(self.to_glib_none().0, years))
267-
.ok_or_else(|| crate::bool_error!("Invalid date"))
286+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_add_years(
287+
self.to_glib_none().0,
288+
years,
289+
))
290+
.ok_or_else(|| crate::bool_error!("Invalid date"))
268291
}
269292
}
270293

@@ -301,7 +324,7 @@ impl DateTime {
301324
#[doc(alias = "g_date_time_format")]
302325
pub fn format(&self, format: &str) -> Result<crate::GString, BoolError> {
303326
unsafe {
304-
Option::<_>::from_glib_full(ffi::g_date_time_format(
327+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_format(
305328
self.to_glib_none().0,
306329
format.to_glib_none().0,
307330
))
@@ -314,8 +337,10 @@ impl DateTime {
314337
#[doc(alias = "g_date_time_format_iso8601")]
315338
pub fn format_iso8601(&self) -> Result<crate::GString, BoolError> {
316339
unsafe {
317-
Option::<_>::from_glib_full(ffi::g_date_time_format_iso8601(self.to_glib_none().0))
318-
.ok_or_else(|| crate::bool_error!("Invalid date"))
340+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_format_iso8601(
341+
self.to_glib_none().0,
342+
))
343+
.ok_or_else(|| crate::bool_error!("Invalid date"))
319344
}
320345
}
321346

@@ -449,8 +474,10 @@ impl DateTime {
449474
#[doc(alias = "g_date_time_to_local")]
450475
pub fn to_local(&self) -> Result<DateTime, BoolError> {
451476
unsafe {
452-
Option::<_>::from_glib_full(ffi::g_date_time_to_local(self.to_glib_none().0))
453-
.ok_or_else(|| crate::bool_error!("Invalid date"))
477+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_to_local(
478+
self.to_glib_none().0,
479+
))
480+
.ok_or_else(|| crate::bool_error!("Invalid date"))
454481
}
455482
}
456483

@@ -464,7 +491,7 @@ impl DateTime {
464491
#[doc(alias = "g_date_time_to_timezone")]
465492
pub fn to_timezone(&self, tz: &TimeZone) -> Result<DateTime, BoolError> {
466493
unsafe {
467-
Option::<_>::from_glib_full(ffi::g_date_time_to_timezone(
494+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_to_timezone(
468495
self.to_glib_none().0,
469496
tz.to_glib_none().0,
470497
))
@@ -487,8 +514,10 @@ impl DateTime {
487514
#[doc(alias = "g_date_time_to_utc")]
488515
pub fn to_utc(&self) -> Result<DateTime, BoolError> {
489516
unsafe {
490-
Option::<_>::from_glib_full(ffi::g_date_time_to_utc(self.to_glib_none().0))
491-
.ok_or_else(|| crate::bool_error!("Invalid date"))
517+
<Option<_> as FromGlibPtrFull<_>>::from_glib_full(ffi::g_date_time_to_utc(
518+
self.to_glib_none().0,
519+
))
520+
.ok_or_else(|| crate::bool_error!("Invalid date"))
492521
}
493522
}
494523
}

glib/src/boxed.rs

Lines changed: 52 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -253,10 +253,13 @@ macro_rules! glib_boxed_wrapper {
253253
}
254254

255255
#[doc(hidden)]
256-
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
257-
unsafe fn from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
258-
if num == 0 || ptr.is_null() {
259-
return Vec::new();
256+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::TryFromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
257+
unsafe fn try_from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
258+
if ptr.is_null() {
259+
return None;
260+
}
261+
if num == 0 {
262+
return Some(Vec::new());
260263
}
261264

262265
let mut res = Vec::<Self>::with_capacity(num);
@@ -265,44 +268,78 @@ macro_rules! glib_boxed_wrapper {
265268
::std::ptr::write(res_ptr.add(i), $crate::translate::from_glib_none(std::ptr::read(ptr.add(i))));
266269
}
267270
res.set_len(num);
268-
res
271+
Some(res)
269272
}
270273

271-
unsafe fn from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
272-
let res = $crate::translate::FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr, num);
274+
unsafe fn try_from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
275+
let res = $crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, num)?;
273276
$crate::ffi::g_free(ptr as *mut _);
274-
res
277+
Some(res)
275278
}
276279

277-
unsafe fn from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
278-
if num == 0 || ptr.is_null() {
280+
unsafe fn try_from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Option<Vec<Self>> {
281+
if ptr.is_null() {
282+
return None;
283+
}
284+
if num == 0 {
279285
$crate::ffi::g_free(ptr as *mut _);
280-
return Vec::new();
286+
return Some(Vec::new());
281287
}
282288

283289
let mut res = Vec::with_capacity(num);
284290
let res_ptr = res.as_mut_ptr();
285291
::std::ptr::copy_nonoverlapping(ptr as *mut Self, res_ptr, num);
286292
res.set_len(num);
287293
$crate::ffi::g_free(ptr as *mut _);
288-
res
294+
Some(res)
295+
}
296+
}
297+
298+
#[doc(hidden)]
299+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
300+
unsafe fn from_glib_none_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
301+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, num).unwrap_or_default()
302+
}
303+
304+
unsafe fn from_glib_container_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
305+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, num).unwrap_or_default()
306+
}
307+
308+
unsafe fn from_glib_full_num_as_vec(ptr: *mut *mut $ffi_name, num: usize) -> Vec<Self> {
309+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, num).unwrap_or_default()
310+
}
311+
}
312+
313+
#[doc(hidden)]
314+
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::TryFromGlibPtrArrayContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
315+
unsafe fn try_from_glib_none_as_vec(ptr: *mut *mut $ffi_name) -> Option<Vec<Self>> {
316+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr)?)
317+
}
318+
319+
unsafe fn try_from_glib_container_as_vec(ptr: *mut *mut $ffi_name) -> Option<Vec<Self>> {
320+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr)?)
321+
}
322+
323+
unsafe fn try_from_glib_full_as_vec(ptr: *mut *mut $ffi_name) -> Option<Vec<Self>> {
324+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr)?)
289325
}
290326
}
291327

292328
#[doc(hidden)]
293329
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::FromGlibPtrArrayContainerAsVec<*mut $ffi_name, *mut *mut $ffi_name> for $name $(<$($generic),+>)? {
294330
unsafe fn from_glib_none_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
295-
$crate::translate::FromGlibContainerAsVec::from_glib_none_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
331+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_none_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
296332
}
297333

298334
unsafe fn from_glib_container_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
299-
$crate::translate::FromGlibContainerAsVec::from_glib_container_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
335+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_container_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
300336
}
301337

302338
unsafe fn from_glib_full_as_vec(ptr: *mut *mut $ffi_name) -> Vec<Self> {
303-
$crate::translate::FromGlibContainerAsVec::from_glib_full_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr))
339+
$crate::translate::TryFromGlibContainerAsVec::try_from_glib_full_num_as_vec(ptr, $crate::translate::c_ptr_array_len(ptr).unwrap_or(0)).unwrap_or_default()
304340
}
305341
}
342+
306343
#[doc(hidden)]
307344
impl $(<$($generic $(: $bound $(+ $bound2)*)?),+>)? $crate::translate::IntoGlibPtr<*mut $ffi_name> for $name $(<$($generic),+>)? {
308345
#[inline]

0 commit comments

Comments
 (0)