1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use crate::types::{DialectId, DialectVersion, MessageId};
use crate::{IntoPayload, MessageInfo, MessageSpec, Payload, SpecError};
/// Interface for autogenerated or custom MAVLink dialect specification.
pub trait Dialect: MessageSpec + IntoPayload + Sized + Sync + Send {
/// Dialect name as it appears in XML definition.
fn name() -> &'static str;
/// Returns `dialect` identifier as specified in MAVLink [XML definitions](https://mavlink.io/en/guide/xml_schema.html).
fn dialect() -> Option<DialectId>;
/// Minor dialect `version` as specified in MAVLink [XML definitions](https://mavlink.io/en/guide/xml_schema.html).
///
/// Corresponds to [`uint8_t_mavlink_version`](https://mavlink.io/en/messages/common.html#HEARTBEAT).
///
/// Dialect version appears in some messages like [HEARTBEAT](https://mavlink.io/en/messages/common.html#HEARTBEAT). In
/// such cases it is usually not directly set by user.
fn version() -> Option<DialectVersion>;
/// Message specification by `id`.
///
/// Clients may access this method to retrieve message specification prior to decoding it from
/// payload.
///
/// # Errors
///
/// Returns [`SpecError::NotInDialect`] if message with specified ID is not supported.
fn message_info(id: MessageId) -> Result<&'static dyn MessageSpec, SpecError>;
/// Decode dialect message from [`Payload`].
fn decode(payload: &Payload) -> Result<Self, SpecError>;
/// Dialect specification.
fn spec() -> &'static DialectSpec;
}
/// Dialect specification.
#[derive(Clone, Debug)]
pub struct DialectSpec {
name: &'static str,
dialect: Option<DialectId>,
version: Option<DialectVersion>,
messages_info: &'static [MessageInfo],
}
impl DialectSpec {
/// Creates dialect specification.
pub const fn new(
name: &'static str,
dialect: Option<DialectId>,
version: Option<DialectVersion>,
messages_info: &'static [MessageInfo],
) -> Self {
Self {
name,
dialect,
version,
messages_info,
}
}
/// Dialect name as it appears in XML definition.
pub fn name(&self) -> &'static str {
self.name
}
/// Returns `dialect` identifier as specified in MAVLink [XML definitions](https://mavlink.io/en/guide/xml_schema.html).
pub fn dialect(&self) -> Option<DialectId> {
self.dialect
}
/// Minor dialect `version` as specified in MAVLink [XML definitions](https://mavlink.io/en/guide/xml_schema.html).
///
/// Corresponds to [`uint8_t_mavlink_version`](https://mavlink.io/en/messages/common.html#HEARTBEAT).
///
/// Dialect version appears in some messages like [HEARTBEAT](https://mavlink.io/en/messages/common.html#HEARTBEAT). In
/// such cases it is usually not directly set by user.
pub fn version(&self) -> Option<DialectVersion> {
self.version
}
/// Message specification by `id`.
///
/// Clients may access this method to retrieve message specification prior to decoding it from
/// payload.
///
/// # Errors
///
/// Returns [`SpecError::NotInDialect`] if message with specified ID is not supported.
pub fn message_info(&self, id: MessageId) -> Result<&MessageInfo, SpecError> {
for info in self.messages_info {
if info.id() == id {
return Ok(info);
}
}
Err(SpecError::NotInDialect(id))
}
}