#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::protocol::{Deprecated, Description, EnumEntry, EnumEntryMavCmdFlags, EnumEntryMavCmdParam};
use crate::utils::Named;
pub(crate) const CMD_ENUM_NAME: &str = "MAV_CMD";
pub type MavCmdValue = u16;
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "specta", derive(specta::Type))]
#[cfg_attr(feature = "specta", specta(rename = "MavInspectCommand"))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Command {
value: MavCmdValue,
name: String,
name_stripped: String,
description: Description,
has_location: bool,
is_destination: bool,
mission_only: bool,
params: Vec<EnumEntryMavCmdParam>,
wip: bool,
deprecated: Option<Deprecated>,
defined_in: String,
}
impl Named for Command {
fn name(&self) -> &str {
&self.name
}
}
impl Named for &Command {
fn name(&self) -> &str {
&self.name
}
}
impl From<EnumEntry> for Command {
#[inline]
fn from(value: EnumEntry) -> Self {
Command::from_enum_entry(&value)
}
}
impl Command {
pub fn from_enum_entry(enum_entry: &EnumEntry) -> Self {
let cmd_flags = match enum_entry.cmd_flags() {
None => EnumEntryMavCmdFlags::default(),
Some(flags) => flags.clone(),
};
let params = {
let mut params = enum_entry.params().to_vec();
params.sort_by_key(|param| param.index());
params
};
Self {
value: enum_entry.value() as MavCmdValue,
name: enum_entry.name().to_string(),
name_stripped: enum_entry.name_stripped().to_string(),
description: Description::new(enum_entry.description()),
has_location: cmd_flags.has_location().unwrap_or_default(),
is_destination: cmd_flags.is_destination().unwrap_or_default(),
mission_only: cmd_flags.mission_only().unwrap_or_default(),
params,
wip: enum_entry.wip(),
deprecated: enum_entry.deprecated().cloned(),
defined_in: enum_entry.defined_in().to_string(),
}
}
pub fn value(&self) -> MavCmdValue {
self.value
}
pub fn name(&self) -> &str {
&self.name
}
pub fn name_stripped(&self) -> &str {
&self.name_stripped
}
pub fn description(&self) -> &str {
self.description.as_str()
}
pub fn has_location(&self) -> bool {
self.has_location
}
pub fn is_destination(&self) -> bool {
self.is_destination
}
pub fn mission_only(&self) -> bool {
self.mission_only
}
pub fn params(&self) -> &[EnumEntryMavCmdParam] {
self.params.as_ref()
}
pub fn wip(&self) -> bool {
self.wip
}
pub fn deprecated(&self) -> Option<&Deprecated> {
self.deprecated.as_ref()
}
pub fn defined_in(&self) -> &str {
self.defined_in.as_str()
}
}