Skip to content

Commit ef6a993

Browse files
authored
Merge pull request #588 from sdroege/optional-values-other-error-types
glib: Allow using other error types and value type checkers for …
2 parents e06623f + 314f2b8 commit ef6a993

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed

glib/src/object.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4300,7 +4300,7 @@ pub unsafe trait IsInterface: ObjectType {}
43004300
pub struct ObjectValueTypeChecker<T>(std::marker::PhantomData<T>);
43014301

43024302
unsafe impl<T: StaticType> crate::value::ValueTypeChecker for ObjectValueTypeChecker<T> {
4303-
type Error = crate::value::ValueTypeMismatchOrNoneError;
4303+
type Error = crate::value::ValueTypeMismatchOrNoneError<crate::value::ValueTypeMismatchError>;
43044304

43054305
fn check(value: &Value) -> Result<(), Self::Error> {
43064306
// g_type_check_value_holds() only checks for the GType of the GValue. This might be

glib/src/value.rs

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,19 @@ pub trait ValueTypeOptional:
7474
{
7575
}
7676

77-
impl<T, C> ValueType for Option<T>
77+
impl<T, C, E> ValueType for Option<T>
7878
where
7979
T: for<'a> FromValue<'a, Checker = C> + ValueTypeOptional + StaticType + 'static,
80-
C: ValueTypeChecker<Error = ValueTypeMismatchOrNoneError>,
80+
C: ValueTypeChecker<Error = ValueTypeMismatchOrNoneError<E>>,
81+
E: error::Error,
8182
{
8283
type Type = T::Type;
8384
}
8485

8586
// rustdoc-stripper-ignore-next
8687
/// Trait for `Value` type checkers.
8788
pub unsafe trait ValueTypeChecker {
88-
type Error: std::error::Error + Send + Sized + 'static;
89+
type Error: error::Error + Send + Sized + 'static;
8990

9091
fn check(value: &Value) -> Result<(), Self::Error>;
9192
}
@@ -207,40 +208,34 @@ impl From<Infallible> for InvalidCharError {
207208
/// An error returned from the [`get`](struct.Value.html#method.get)
208209
/// function on a [`Value`](struct.Value.html) for optional types.
209210
#[derive(Clone, PartialEq, Eq, Debug)]
210-
pub enum ValueTypeMismatchOrNoneError {
211-
WrongValueType(ValueTypeMismatchError),
211+
pub enum ValueTypeMismatchOrNoneError<E: error::Error> {
212+
WrongValueType(E),
212213
UnexpectedNone,
213214
}
214215

215-
impl fmt::Display for ValueTypeMismatchOrNoneError {
216+
impl<E: error::Error> fmt::Display for ValueTypeMismatchOrNoneError<E> {
216217
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
217218
match self {
218-
Self::WrongValueType(err) => err.fmt(f),
219+
Self::WrongValueType(err) => <E as fmt::Display>::fmt(err, f),
219220
Self::UnexpectedNone => write!(f, "Unexpected None",),
220221
}
221222
}
222223
}
223224

224-
impl error::Error for ValueTypeMismatchOrNoneError {}
225+
impl<E: error::Error> error::Error for ValueTypeMismatchOrNoneError<E> {}
225226

226-
impl From<ValueTypeMismatchError> for ValueTypeMismatchOrNoneError {
227-
fn from(err: ValueTypeMismatchError) -> Self {
227+
impl<E: error::Error> From<E> for ValueTypeMismatchOrNoneError<E> {
228+
fn from(err: E) -> Self {
228229
Self::WrongValueType(err)
229230
}
230231
}
231232

232-
impl From<Infallible> for ValueTypeMismatchOrNoneError {
233-
fn from(e: Infallible) -> Self {
234-
match e {}
235-
}
236-
}
237-
238233
// rustdoc-stripper-ignore-next
239234
/// Generic `Value` type checker for optional types.
240235
pub struct GenericValueTypeOrNoneChecker<T>(std::marker::PhantomData<T>);
241236

242237
unsafe impl<T: StaticType> ValueTypeChecker for GenericValueTypeOrNoneChecker<T> {
243-
type Error = ValueTypeMismatchOrNoneError;
238+
type Error = ValueTypeMismatchOrNoneError<ValueTypeMismatchError>;
244239

245240
fn check(value: &Value) -> Result<(), Self::Error> {
246241
GenericValueTypeChecker::<T>::check(value)?;
@@ -281,30 +276,33 @@ pub unsafe trait FromValue<'a>: Sized {
281276
/// This trait is auto-implemented for the appropriate types and is sealed.
282277
pub trait FromValueOptional<'a>: private::FromValueOptionalSealed<'a> {}
283278

284-
impl<'a, T, C> FromValueOptional<'a> for T
279+
impl<'a, T, C, E> FromValueOptional<'a> for T
285280
where
286281
T: FromValue<'a, Checker = C>,
287-
C: ValueTypeChecker<Error = ValueTypeMismatchOrNoneError>,
282+
C: ValueTypeChecker<Error = ValueTypeMismatchOrNoneError<E>>,
283+
E: error::Error,
288284
{
289285
}
290286

291287
mod private {
292288
pub trait FromValueOptionalSealed<'a> {}
293289

294-
impl<'a, T, C> FromValueOptionalSealed<'a> for T
290+
impl<'a, T, C, E> FromValueOptionalSealed<'a> for T
295291
where
296292
T: super::FromValue<'a, Checker = C>,
297-
C: super::ValueTypeChecker<Error = super::ValueTypeMismatchOrNoneError>,
293+
C: super::ValueTypeChecker<Error = super::ValueTypeMismatchOrNoneError<E>>,
294+
E: super::error::Error,
298295
{
299296
}
300297
}
301298

302299
// rustdoc-stripper-ignore-next
303300
/// Blanket implementation for all optional types.
304-
unsafe impl<'a, T, C> FromValue<'a> for Option<T>
301+
unsafe impl<'a, T, C, E> FromValue<'a> for Option<T>
305302
where
306303
T: FromValue<'a, Checker = C> + StaticType,
307-
C: ValueTypeChecker<Error = ValueTypeMismatchOrNoneError>,
304+
C: ValueTypeChecker<Error = ValueTypeMismatchOrNoneError<E>>,
305+
E: error::Error,
308306
{
309307
type Checker = GenericValueTypeChecker<T>;
310308

0 commit comments

Comments
 (0)