Skip to main content

numbat_codec/equivalent/
codec_convert.rs

1use crate::{
2    CodecFrom, PanicErrorHandler, TopDecodeMultiInput, TopEncodeMulti, TopEncodeMultiOutput,
3};
4
5pub fn codec_convert_or_panic<From, To, Medium>(from: From) -> To
6where
7    From: TopEncodeMulti,
8    To: CodecFrom<From>,
9    Medium: Default + TopDecodeMultiInput + TopEncodeMultiOutput,
10{
11    let mut medium: Medium = Default::default();
12    let Ok(()) = from.multi_encode_or_handle_err(&mut medium, PanicErrorHandler);
13    let Ok(result) = To::multi_decode_or_handle_err(&mut medium, PanicErrorHandler);
14    result
15}
16
17#[allow(unused)]
18#[cfg(test)]
19mod test {
20    use alloc::vec::Vec;
21
22    use super::*;
23
24    #[test]
25    fn test_codec_convert_or_panic() {
26        assert_eq!(5i64, codec_convert_or_panic::<_, _, Vec<Vec<u8>>>(5i64));
27        assert_eq!(5i64, codec_convert_or_panic::<_, _, Vec<Vec<u8>>>(5i32));
28        assert_eq!(5i64, codec_convert_or_panic::<_, _, Vec<Vec<u8>>>(5i32));
29    }
30
31    fn convert_add<T1, T2, R>(x: T1, y: T2) -> R
32    where
33        T1: TopEncodeMulti,
34        T2: TopEncodeMulti,
35        u32: CodecFrom<T1>,
36        u32: CodecFrom<T2>,
37        R: CodecFrom<u32>,
38    {
39        let conv_x = codec_convert_or_panic::<T1, u32, Vec<Vec<u8>>>(x);
40        let conv_y = codec_convert_or_panic::<T2, u32, Vec<Vec<u8>>>(y);
41        codec_convert_or_panic::<u32, R, Vec<Vec<u8>>>(conv_x + conv_y)
42    }
43
44    #[test]
45    fn test_convert_add() {
46        assert_eq!(3u32, convert_add(1u32, 2u32));
47        assert_eq!(8u64, convert_add(3u16, 5u8));
48        assert_eq!(17usize, convert_add(8usize, 9usize));
49    }
50}