#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use crate::protocol::traits::{Buildable, Builder};
use crate::protocol::{enums::EnumEntryMavCmdFlags, enums::EnumEntryMavCmdParam, Deprecated};
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct EnumEntry {
value: u32,
name: String,
description: String,
cmd_flags: Option<EnumEntryMavCmdFlags>,
params: Vec<EnumEntryMavCmdParam>,
wip: bool,
deprecated: Option<Deprecated>,
defined_in: Option<String>,
}
impl Buildable for EnumEntry {
type Builder = EnumEntryBuilder;
fn to_builder(&self) -> EnumEntryBuilder {
EnumEntryBuilder {
entry: self.clone(),
}
}
}
impl EnumEntry {
pub fn builder() -> EnumEntryBuilder {
EnumEntryBuilder::new()
}
pub fn value(&self) -> u32 {
self.value
}
pub fn name(&self) -> &str {
&self.name
}
pub fn description(&self) -> &str {
&self.description
}
pub fn cmd_flags(&self) -> Option<&EnumEntryMavCmdFlags> {
self.cmd_flags.as_ref()
}
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) -> Option<&String> {
self.defined_in.as_ref()
}
}
#[derive(Debug, Clone, Default)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct EnumEntryBuilder {
entry: EnumEntry,
}
impl Builder for EnumEntryBuilder {
type Buildable = EnumEntry;
fn build(&self) -> EnumEntry {
#[allow(clippy::match_single_binding)]
match self.entry.clone() {
EnumEntry {
value,
name,
description,
cmd_flags,
params,
wip,
deprecated,
defined_in,
} => EnumEntry {
value,
name,
description,
cmd_flags,
params,
wip,
deprecated,
defined_in,
},
}
}
}
impl EnumEntryBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn set_value(&mut self, value: u32) -> &mut Self {
self.entry.value = value;
self
}
pub fn set_name(&mut self, name: String) -> &mut Self {
self.entry.name = name;
self
}
pub fn set_description(&mut self, description: String) -> &mut Self {
self.entry.description = description;
self
}
pub fn set_cmd_flags(&mut self, cmd_flags: Option<EnumEntryMavCmdFlags>) -> &mut Self {
self.entry.cmd_flags = cmd_flags;
self
}
pub fn set_params(&mut self, params: Vec<EnumEntryMavCmdParam>) -> &mut Self {
self.entry.params = params;
self
}
pub fn set_wip(&mut self, wip: bool) -> &mut Self {
self.entry.wip = wip;
self
}
pub fn set_deprecated(&mut self, deprecated: Option<Deprecated>) -> &mut Self {
self.entry.deprecated = deprecated;
self
}
pub fn set_defined_in(&mut self, defined_in: Option<String>) -> &mut Self {
self.entry.defined_in = defined_in;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::protocol::{DeprecatedSince, Units};
#[test]
fn enum_entry_builder() {
let entry = EnumEntryBuilder::new()
.set_value(10)
.set_name("name".to_string())
.set_description("description".to_string())
.set_cmd_flags(Some(
EnumEntryMavCmdFlags::builder()
.set_has_location(Some(true))
.build(),
))
.set_params(vec![EnumEntryMavCmdParam::builder()
.set_units(Some(Units::AmpereHour))
.build()])
.set_wip(true)
.set_deprecated(Some(Deprecated::new(
DeprecatedSince::default(),
"better".to_string(),
)))
.set_defined_in(Some("unknown".to_string()))
.build();
assert!(matches!(entry, EnumEntry { .. }));
assert_eq!(entry.value(), 10);
assert_eq!(entry.name(), "name");
assert_eq!(entry.description(), "description");
assert!(entry.cmd_flags().unwrap().has_location().unwrap());
assert_eq!(entry.params().len(), 1);
assert!(matches!(
entry.params().get(0).unwrap().units(),
Some(Units::AmpereHour)
));
assert!(entry.wip());
assert_eq!(entry.deprecated().unwrap().replaced_by(), "better");
assert_eq!(entry.defined_in().unwrap(), "unknown");
}
}