async_proto/impls/
noisy_float.rs1use {
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 #[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}