rock_n_rollup/services/
external.rs1use 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 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}