use std::collections::HashMap;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::proto::mavlink_messages_v1 as proto;
use crate::protocol::{enums::EnumEntry, errors::ProtoImportError, Deprecated};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Enum {
name: String,
description: String,
entries: HashMap<String, EnumEntry>,
bitmask: bool,
deprecated: Option<Deprecated>,
defined_in: Vec<String>,
}
impl Enum {
pub fn new(
name: String,
description: String,
entries: HashMap<String, EnumEntry>,
bitmask: bool,
deprecated: Option<Deprecated>,
defined_in: Vec<String>,
) -> Self {
Self {
name,
description,
entries,
bitmask,
deprecated,
defined_in,
}
}
pub fn to_proto(&self) -> proto::Enum {
proto::Enum {
name: self.name.clone(),
description: self.description.clone(),
entries: self
.entries
.iter()
.map(|(name, entry)| (name.clone(), entry.to_proto()))
.collect(),
bitmask: self.bitmask,
deprecated: self.deprecated.as_ref().map(|d| d.to_proto()),
defined_in: self.defined_in.clone(),
}
}
pub fn from_proto(proto: &proto::Enum) -> Result<Self, ProtoImportError> {
let mut entries = HashMap::new();
for (name, entry) in &proto.entries {
entries.insert(name.clone(), EnumEntry::from_proto(entry)?);
}
Ok(Self {
name: proto.name.clone(),
description: proto.description.clone(),
entries,
bitmask: proto.bitmask,
deprecated: match &proto.deprecated {
None => None,
Some(depr) => Some(Deprecated::from_proto(depr)?),
},
defined_in: proto.defined_in.clone(),
})
}
pub fn name(&self) -> &String {
&self.name
}
pub fn description(&self) -> &String {
&self.description
}
pub fn entries(&self) -> &HashMap<String, EnumEntry> {
&self.entries
}
pub fn bitmask(&self) -> bool {
self.bitmask
}
pub fn deprecated(&self) -> &Option<Deprecated> {
&self.deprecated
}
pub fn defined_in(&self) -> &Vec<String> {
&self.defined_in
}
}