rock_n_rollup/services/
external.rs

1use crate::core::{FromInput, Input, Runtime};
2
3pub trait FromExternal
4where
5    Self: Sized,
6{
7    fn from_external(input: Vec<u8>) -> Result<Self, ()>;
8}
9
10pub struct External<T>
11where
12    T: FromExternal,
13{
14    level: u32,
15    id: u32,
16    payload: T,
17}
18
19impl<T> External<T>
20where
21    T: FromExternal,
22{
23    pub fn level(&self) -> u32 {
24        self.level
25    }
26
27    pub fn id(&self) -> u32 {
28        self.id
29    }
30
31    pub fn payload(&self) -> &T {
32        &self.payload
33    }
34}
35
36impl<T, S> FromInput<Vec<u8>, S> for External<T>
37where
38    T: FromExternal,
39{
40    fn from_input<R: Runtime>(_: &mut R, input: &Input<Vec<u8>>, _: &S) -> Result<Self, ()> {
41        // First we need to make sure it starts by 0x01
42        match input.payload[..] {
43            [0x01, ..] => {
44                let payload = input.payload.iter().skip(1).copied().collect::<Vec<u8>>();
45                let payload = T::from_external(payload)?;
46                Ok(External {
47                    level: input.level,
48                    id: input.id,
49                    payload,
50                })
51            }
52            _ => Err(()),
53        }
54    }
55}
56
57impl FromExternal for String {
58    fn from_external(input: Vec<u8>) -> Result<Self, ()> {
59        String::from_utf8(input).map_err(|_| ())
60    }
61}
62
63impl FromExternal for Vec<u8> {
64    fn from_external(input: Vec<u8>) -> Result<Self, ()> {
65        Ok(input)
66    }
67}