mavinspect 0.1.0-alpha2

MAVInspect is a CLI tool and a library to parse and inspect MAVLink protocol XML definitions
Documentation
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};

use crate::proto::mavlink_messages_v1 as proto;
use crate::protocol::{
    enums::EnumEntryMavCmdFlags, enums::EnumEntryMavCmdParam, errors::ProtoImportError, Deprecated,
};

/// Enum entry specification.
///
/// Used in [`super::Enum`].
#[derive(Debug, Clone)]
#[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 EnumEntry {
    /// Default constructor.
    #[allow(clippy::too_many_arguments)]
    pub fn new(
        value: u32,
        name: String,
        description: String,
        cmd_flags: Option<EnumEntryMavCmdFlags>,
        params: Vec<EnumEntryMavCmdParam>,
        wip: bool,
        deprecated: Option<Deprecated>,
        defined_in: Option<String>,
    ) -> Self {
        Self {
            value,
            name,
            description,
            cmd_flags,
            params,
            wip,
            deprecated,
            defined_in,
        }
    }

    /// Converts to Protobuf [`proto::EnumEntry`]
    pub fn to_proto(&self) -> proto::EnumEntry {
        proto::EnumEntry {
            value: self.value,
            name: self.name.clone(),
            description: self.description.clone(),
            cmd_flags: self.cmd_flags.as_ref().map(|c| c.to_proto()),
            params: self.params.iter().map(|p| p.to_proto()).collect(),
            wip: self.wip,
            deprecated: self.deprecated.as_ref().map(|d| d.to_proto()),
            defined_in: self.defined_in.clone(),
        }
    }

    /// Constructs from Protobuf [`proto::EnumEntry`]
    pub fn from_proto(proto: &proto::EnumEntry) -> Result<EnumEntry, ProtoImportError> {
        let mut params = Vec::new();

        for param in &proto.params {
            params.push(EnumEntryMavCmdParam::from_proto(param.clone())?)
        }

        Ok(EnumEntry {
            value: proto.value,
            name: proto.name.clone(),
            description: proto.description.clone(),
            cmd_flags: proto
                .cmd_flags
                .as_ref()
                .map(|flags| EnumEntryMavCmdFlags::from_proto(flags.clone())),
            params,
            wip: proto.wip,
            deprecated: match &proto.deprecated {
                Some(deprecated) => Some(Deprecated::from_proto(deprecated)?),
                None => None,
            },
            defined_in: proto.defined_in.clone(),
        })
    }

    /// Enum entry value.
    pub fn value(&self) -> u32 {
        self.value
    }

    /// Enum entry name.
    pub fn name(&self) -> &String {
        &self.name
    }

    /// Enum entry description.
    pub fn description(&self) -> &String {
        &self.description
    }

    /// Deprecation status (if applicable).
    pub fn deprecated(&self) -> &Option<Deprecated> {
        &self.deprecated
    }
}