hermes_encoding_components/impls/
convert_and_encode.rs1use 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}