async_proto/impls/
noisy_float.rs

1use {
2    noisy_float::{
3        FloatChecker,
4        NoisyFloat,
5        prelude::*,
6    },
7    async_proto_derive::impl_protocol_for,
8    crate::{
9        Protocol,
10        ReadErrorKind,
11    },
12};
13
14#[derive(Protocol)]
15#[async_proto(internal)]
16struct NoisyFloatProxy<F: Float> {
17    raw: F,
18}
19
20impl<F: Float, C: FloatChecker<F>> TryFrom<NoisyFloatProxy<F>> for NoisyFloat<F, C> {
21    type Error = ReadErrorKind;
22
23    fn try_from(NoisyFloatProxy { raw }: NoisyFloatProxy<F>) -> Result<Self, ReadErrorKind> {
24        Self::try_new(raw).ok_or_else(|| ReadErrorKind::Custom(format!("read an invalid noisy float")))
25    }
26}
27
28impl<'a, F: Float, C: FloatChecker<F>> From<&'a NoisyFloat<F, C>> for NoisyFloatProxy<F> {
29    fn from(float: &NoisyFloat<F, C>) -> Self {
30        Self { raw: float.raw() }
31    }
32}
33
34impl_protocol_for! {
35    #[async_proto(attr(cfg_attr(docsrs, doc(cfg(feature = "noisy_float")))))]
36    /// A noisy float is represented like its underlying type. Reading an invalid float produces a [`ReadErrorKind::Custom`].
37    #[async_proto(via = NoisyFloatProxy<F>, where(F: Protocol + Float + Send + Sync + 'static, C: FloatChecker<F> + Send + Sync))]
38    type NoisyFloat<F: Float, C: FloatChecker<F>>;
39}