Seal the Params trait
This avoids situations like #41 where people try to implement the trait only to find out that you simply can't.
This commit is contained in:
parent
f0c6ce6e71
commit
26535a099d
|
@ -53,12 +53,27 @@ bitflags::bitflags! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See https://rust-lang.github.io/api-guidelines/future-proofing.html for more information
|
||||||
|
mod sealed {
|
||||||
|
/// Dummy trait to prevent [`Param`] from being implemented outside of NIH-plug. This is not
|
||||||
|
/// possible because of the way `ParamPtr` works, so it's best to just make it flat out impossible.
|
||||||
|
pub trait Sealed {}
|
||||||
|
}
|
||||||
|
pub(crate) use sealed::Sealed;
|
||||||
|
|
||||||
/// Describes a single parameter of any type. Most parameter implementations also have a field
|
/// Describes a single parameter of any type. Most parameter implementations also have a field
|
||||||
/// called `value` that and a field called `smoothed`. The former stores the latest unsmoothed
|
/// called `value` that and a field called `smoothed`. The former stores the latest unsmoothed
|
||||||
/// value, and the latter can be used to access the smoother. These two fields should be used in DSP
|
/// value, and the latter can be used to access the smoother. These two fields should be used in DSP
|
||||||
/// code to either get the parameter's current (smoothed) value. In UI code the getters from this
|
/// code to either get the parameter's current (smoothed) value. In UI code the getters from this
|
||||||
/// trait should be used instead.
|
/// trait should be used instead.
|
||||||
pub trait Param: Display {
|
///
|
||||||
|
/// # Sealed
|
||||||
|
///
|
||||||
|
/// This trait cannot be implemented outside of NIH-plug itself. If you want to create new
|
||||||
|
/// abstractions around parameters, consider wrapping them in a struct instead. Then use the
|
||||||
|
/// `#[nested(id_prefix = "foo")]` syntax from the [`Params`] trait to reuse that wrapper in
|
||||||
|
/// multiple places.
|
||||||
|
pub trait Param: Display + sealed::Sealed {
|
||||||
/// The plain parameter type.
|
/// The plain parameter type.
|
||||||
type Plain: PartialEq;
|
type Plain: PartialEq;
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,9 @@ impl Display for BoolParam {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `Params` can not be implemented outside of NIH-plug itself because `ParamPtr` is also closed
|
||||||
|
impl super::Sealed for BoolParam {}
|
||||||
|
|
||||||
impl Param for BoolParam {
|
impl Param for BoolParam {
|
||||||
type Plain = bool;
|
type Plain = bool;
|
||||||
|
|
||||||
|
|
|
@ -110,6 +110,9 @@ impl Display for EnumParamInner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `Params` can not be implemented outside of NIH-plug itself because `ParamPtr` is also closed
|
||||||
|
impl<T: Enum + PartialEq> super::Sealed for EnumParam<T> {}
|
||||||
|
|
||||||
impl<T: Enum + PartialEq> Param for EnumParam<T> {
|
impl<T: Enum + PartialEq> Param for EnumParam<T> {
|
||||||
type Plain = T;
|
type Plain = T;
|
||||||
|
|
||||||
|
@ -188,6 +191,9 @@ impl<T: Enum + PartialEq> Param for EnumParam<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `Params` can not be implemented outside of NIH-plug itself because `ParamPtr` is also closed
|
||||||
|
impl super::Sealed for EnumParamInner {}
|
||||||
|
|
||||||
impl Param for EnumParamInner {
|
impl Param for EnumParamInner {
|
||||||
type Plain = i32;
|
type Plain = i32;
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,9 @@ impl Display for FloatParam {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `Params` can not be implemented outside of NIH-plug itself because `ParamPtr` is also closed
|
||||||
|
impl super::Sealed for FloatParam {}
|
||||||
|
|
||||||
impl Param for FloatParam {
|
impl Param for FloatParam {
|
||||||
type Plain = f32;
|
type Plain = f32;
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,9 @@ impl Display for IntParam {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// `Params` can not be implemented outside of NIH-plug itself because `ParamPtr` is also closed
|
||||||
|
impl super::Sealed for IntParam {}
|
||||||
|
|
||||||
impl Param for IntParam {
|
impl Param for IntParam {
|
||||||
type Plain = i32;
|
type Plain = i32;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue