use std::collections::HashMap;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::proto::mavlink_messages_v1 as proto;
use crate::protocol::{Enum, Message, MessageId};
use super::errors::ProtoImportError;
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Dialect {
name: String,
version: Option<u8>,
dialect: Option<u8>,
messages: HashMap<MessageId, Message>,
enums: HashMap<String, Enum>,
}
impl Dialect {
pub fn new(
name: String,
version: Option<u8>,
dialect: Option<u8>,
messages: HashMap<MessageId, Message>,
enums: HashMap<String, Enum>,
) -> Self {
Self {
name,
version,
dialect,
messages,
enums,
}
}
pub fn to_proto(&self) -> proto::Dialect {
proto::Dialect {
name: self.name.clone(),
version: self.version.map(|ver| ver as u32),
dialect: self.dialect.map(|dialect| dialect as u32),
messages: self
.messages
.iter()
.map(|(&id, msg)| (id, msg.to_proto()))
.collect(),
enums: self
.enums
.iter()
.map(|(name, enm)| (name.clone(), enm.to_proto()))
.collect(),
}
}
pub fn from_proto(proto: &proto::Dialect) -> Result<Self, ProtoImportError> {
let mut messages = HashMap::new();
let mut enums = HashMap::new();
for (&id, message) in &proto.messages {
messages.insert(id, Message::from_proto(message)?);
}
for (name, enm) in &proto.enums {
enums.insert(name.clone(), Enum::from_proto(enm)?);
}
Ok(Self {
name: proto.name.clone(),
version: proto.version.map(|v| v as u8),
dialect: proto.dialect.map(|dialect| dialect as u8),
messages,
enums,
})
}
pub fn name(&self) -> &String {
&self.name
}
pub fn version(&self) -> Option<u8> {
self.version
}
pub fn messages(&self) -> &HashMap<MessageId, Message> {
&self.messages
}
pub fn enums(&self) -> &HashMap<String, Enum> {
&self.enums
}
}