multiversx_sc_codec/
codec_convert.rs

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