hermes_encoding_components/impls/
convert_and_encode.rs

1use core::marker::PhantomData;
2
3use cgp::core::Async;
4
5use crate::traits::convert::CanConvert;
6use crate::traits::decode::{CanDecode, Decoder};
7use crate::traits::encode::{CanEncode, Encoder};
8
9pub struct ConvertAndEncode<Raw>(pub PhantomData<Raw>);
10
11impl<Encoding, Strategy, Value, Raw> Encoder<Encoding, Strategy, Value> for ConvertAndEncode<Raw>
12where
13    Encoding: CanEncode<Strategy, Raw> + CanConvert<Value, Raw>,
14    Raw: Async,
15{
16    fn encode(encoding: &Encoding, value: &Value) -> Result<Encoding::Encoded, Encoding::Error> {
17        let raw = encoding.convert(value)?;
18
19        encoding.encode(&raw)
20    }
21}
22
23impl<Encoding, Strategy, Value, Raw> Decoder<Encoding, Strategy, Value> for ConvertAndEncode<Raw>
24where
25    Encoding: CanDecode<Strategy, Raw> + CanConvert<Raw, Value>,
26    Raw: Async,
27{
28    fn decode(encoding: &Encoding, encoded: &Encoding::Encoded) -> Result<Value, Encoding::Error> {
29        let raw = encoding.decode(encoded)?;
30
31        encoding.convert(&raw)
32    }
33}