Trait gstreamer::format::compatible::CompatibleFormattedValue
source · pub trait CompatibleFormattedValue<V: FormattedValue> {
type Original: FormattedValue;
// Required methods
fn try_into_checked(
self,
other: V,
) -> Result<Self::Original, FormattedValueError>;
fn try_into_checked_explicit(
self,
format: Format,
) -> Result<Self::Original, FormattedValueError>;
}
Expand description
A trait implemented on types which can hold FormattedValue
s compatible with parameter F
.
This trait is auto-implemented based on FormattedValue
s additional traits
such as SpecificFormattedValue
.
§Example
Consider the following function:
fn with_compatible_formats<V: FormattedValue>(
arg1: V,
arg2: impl CompatibleFormattedValue<V>,
) {
// This is required to access arg2 as a FormattedValue:
let _arg2 = arg2.try_into_checked(arg1).unwrap();
}
// This is Ok because arg1 is a ClockTime and arg2 is
// an Option<ClockTime> which are compatible format-wise.
with_compatible_formats(ClockTime::ZERO, ClockTime::NONE);
// This is Ok because arg1 is a ClockTime and arg2 is
// a GenericFormattedValue which are compatible format-wise.
with_compatible_formats(
ClockTime::ZERO,
GenericFormattedValue::Time(None),
);
Users are able to call the function with arguments:
- of the same type (e.g.
ClockTime
), - of different types, but able to hold a value of the same
Format
(e.g.ClockTime
andOption<ClockTime>
). - One of a Formatted Value (specific or generic), the other being
a
GenericFormattedValue
.
Format compatibility for cases 1 and 2 is enforced by the type system, while case 3 will be checked at runtime time.
// This doesn't compile because the arguments are not compatible:
let _ = with_compatible_formats(ClockTime::ZERO, Bytes(Some(42)));
Note: users will not be able use arg2
directly unless format
check succeeds:
fn with_compatible_formats<V: FormattedValue>(
arg1: V,
arg2: impl CompatibleFormattedValue<V>,
) {
// This doesn't compile because arg2 hasn't been checked:
let _format = arg2.format();
}
Required Associated Types§
type Original: FormattedValue
Required Methods§
sourcefn try_into_checked(
self,
other: V,
) -> Result<Self::Original, FormattedValueError>
fn try_into_checked( self, other: V, ) -> Result<Self::Original, FormattedValueError>
Returns Ok(self)
with its type restored if it is compatible with the format of other
.
When used with compatible SpecificFormattedValue
s, checks
are enforced by the type system, no runtime checks are performed.
When used with FormattedValue
/ GenericFormattedValue
and
vice versa, a runtime format check is performed. If the check fails,
Err(FormattedValueError)
is returned.
sourcefn try_into_checked_explicit(
self,
format: Format,
) -> Result<Self::Original, FormattedValueError>
fn try_into_checked_explicit( self, format: Format, ) -> Result<Self::Original, FormattedValueError>
Returns Ok(self)
with its type restored if it is compatible with the format of V
.
When possible, prefer using Self::try_into_checked
which
reduces the risk of misuse.
When used with compatible SpecificFormattedValue
s, checks
are enforced by the type system, no runtime checks are performed.
When used with SpecificFormattedValue
as a parameter and
a GenericFormattedValue
as Self
, a runtime check is performed
against the default format of the parameter. If the check fails,
Err(FormattedValueError)
is returned.
When used with GenericFormattedValue
as a parameter and
a SpecificFormattedValue
as Self
, the format
argument
used. If the check fails, Err(FormattedValueError)
is returned.