#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::proto::mavlink_messages_v1 as proto;
use crate::protocol::{errors::ProtoImportError, Deprecated, MessageField};
pub type MessageId = u32;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Message {
id: MessageId,
name: String,
description: String,
fields: Vec<MessageField>,
wip: bool,
deprecated: Option<Deprecated>,
defined_in: Option<String>,
}
impl Message {
pub fn new(
id: MessageId,
name: String,
description: String,
fields: Vec<MessageField>,
wip: bool,
deprecated: Option<Deprecated>,
defined_in: Option<String>,
) -> Self {
Self {
id,
name,
description,
fields,
wip,
deprecated,
defined_in,
}
}
pub fn to_proto(&self) -> proto::Message {
proto::Message {
id: self.id,
name: self.name.clone(),
description: self.description.clone(),
fields: self.fields.iter().map(MessageField::to_proto).collect(),
wip: self.wip,
deprecated: self.deprecated.as_ref().map(|depr| depr.to_proto()),
defined_in: self.defined_in.clone(),
}
}
pub fn from_proto(proto: &proto::Message) -> Result<Self, ProtoImportError> {
let mut fields = Vec::new();
for field in &proto.fields {
fields.push(MessageField::from_proto(field)?);
}
Ok(Self {
id: proto.id as MessageId,
name: proto.name.clone(),
description: proto.description.clone(),
fields,
wip: proto.wip,
deprecated: match &proto.deprecated {
None => None,
Some(deprecated) => Some(Deprecated::from_proto(deprecated)?),
},
defined_in: proto.defined_in.clone(),
})
}
pub fn id(&self) -> MessageId {
self.id
}
pub fn name(&self) -> &String {
&self.name
}
pub fn description(&self) -> &String {
&self.description
}
pub fn fields(&self) -> &Vec<MessageField> {
&self.fields
}
pub fn wip(&self) -> bool {
self.wip
}
pub fn deprecated(&self) -> &Option<Deprecated> {
&self.deprecated
}
pub fn defined_in(&self) -> &Option<String> {
&self.defined_in
}
}