mavlink_core/
utils.rs

1//! Utilities for processing MAVLink messages
2
3/// Removes the trailing zeroes in the payload
4///
5/// # Note:
6///
7/// There must always be at least one remaining byte even if it is a
8/// zero byte.
9pub fn remove_trailing_zeroes(data: &[u8]) -> usize {
10    let mut len = data.len();
11
12    for b in data[1..].iter().rev() {
13        if *b != 0 {
14            break;
15        }
16
17        len -= 1;
18    }
19
20    len
21}
22
23/// A trait very similar to [`Default`] but is only implemented for the equivalent Rust types to
24/// `MavType`s.
25///
26/// This is only needed because rust doesn't currently implement `Default` for arrays
27/// of all sizes. In particular this trait is only ever used when the "serde" feature is enabled.
28/// For more information, check out [this issue](https://users.rust-lang.org/t/issue-for-derives-for-arrays-greater-than-size-32/59055/3).
29pub trait RustDefault: Copy {
30    fn rust_default() -> Self;
31}
32
33impl<T: RustDefault, const N: usize> RustDefault for [T; N] {
34    #[inline(always)]
35    fn rust_default() -> Self {
36        let val: T = RustDefault::rust_default();
37        [val; N]
38    }
39}
40
41impl RustDefault for u8 {
42    #[inline(always)]
43    fn rust_default() -> Self {
44        0
45    }
46}
47
48impl RustDefault for i8 {
49    #[inline(always)]
50    fn rust_default() -> Self {
51        0
52    }
53}
54
55impl RustDefault for u16 {
56    #[inline(always)]
57    fn rust_default() -> Self {
58        0
59    }
60}
61
62impl RustDefault for i16 {
63    #[inline(always)]
64    fn rust_default() -> Self {
65        0
66    }
67}
68
69impl RustDefault for u32 {
70    #[inline(always)]
71    fn rust_default() -> Self {
72        0
73    }
74}
75
76impl RustDefault for i32 {
77    #[inline(always)]
78    fn rust_default() -> Self {
79        0
80    }
81}
82
83impl RustDefault for u64 {
84    #[inline(always)]
85    fn rust_default() -> Self {
86        0
87    }
88}
89
90impl RustDefault for i64 {
91    #[inline(always)]
92    fn rust_default() -> Self {
93        0
94    }
95}
96
97impl RustDefault for char {
98    #[inline(always)]
99    fn rust_default() -> Self {
100        '\0'
101    }
102}
103
104impl RustDefault for f32 {
105    #[inline(always)]
106    fn rust_default() -> Self {
107        0.0
108    }
109}
110
111impl RustDefault for f64 {
112    #[inline(always)]
113    fn rust_default() -> Self {
114        0.0
115    }
116}