Guest User

Untitled

a guest
Oct 20th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. trait Parsable<'a>
  2. where
  3. Self: Sized,
  4. {
  5. fn try_parse(data: &'a [u8]) -> Result<Self, ()>;
  6. }
  7.  
  8. trait Containing<'a> {
  9. fn get_inner(&'a self) -> Layer<'a>;
  10. }
  11.  
  12. struct Layer<'a> {
  13. typ: u8,
  14. data: &'a [u8],
  15. }
  16.  
  17. struct Concrete<'a> {
  18. other: u16,
  19. payload: &'a [u8],
  20. }
  21.  
  22. impl<'a> Parsable<'a> for Concrete<'a> {
  23. fn try_parse(data: &'a [u8]) -> Result<Concrete<'a>, ()> {
  24. Ok(Concrete {
  25. other: data[0] as u16,
  26. payload: &data[1..],
  27. })
  28. }
  29. }
  30.  
  31. impl<'a> Containing<'a> for Concrete<'a> {
  32. fn get_inner(&'a self) -> Layer<'a> {
  33. Layer {
  34. typ: 65,
  35. data: self.payload,
  36. }
  37. }
  38. }
  39.  
  40. fn main() {
  41. let data: &[u8] = &[0; 128];
  42.  
  43. process(data)
  44. }
  45.  
  46. fn process<'x>(data: &'x [u8]) {
  47. let mut count = 2;
  48. let mut outermost: Layer<'x> = Layer { typ: 12, data };
  49. while count > 0 {
  50. count -= 1;
  51. let res_parse: Result<Concrete<'x>, ()> = Concrete::try_parse(outermost.data);
  52. let concrete: Concrete<'x> = res_parse.expect("unable to parse layer");
  53. // expect no lifetime error, since the 'x lifetime bound
  54. // should be fulfilled by data being 'x?
  55. outermost = concrete.get_inner();
  56. }
  57. }
Add Comment
Please, Sign In to add comment