use binrw::binread;
#[cfg(target_arch = "wasm32")]
use tsify_next::Tsify;
use serde::{Deserialize, Serialize, Serializer};
#[binread]
#[derive(Hash, Eq, PartialEq, Debug, Clone, Copy)]
#[br(repr(u16))]
#[cfg_attr(target_arch = "wasm32", derive(Tsify))]
pub enum FeaturePoint {
BaseFeature = 1,
VisionFeature,
WaypointFeature,
AgricultureFeature,
AirLinkFeature,
AfterSalesFeature,
DJIFlyCustomFeature,
PlaintextFeature,
FlightHubFeature,
GimbalFeature,
RCFeature,
CameraFeature,
BatteryFeature,
FlySafeFeature,
SecurityFeature,
}
impl FeaturePoint {
pub fn from_record_type(record_type: u8, version: u8) -> Self {
match record_type {
1 => FeaturePoint::BaseFeature,
2 => FeaturePoint::BaseFeature,
3 => {
if version == 13 {
FeaturePoint::BaseFeature
} else {
FeaturePoint::GimbalFeature
}
}
4 => {
if version == 13 {
FeaturePoint::BaseFeature
} else {
FeaturePoint::RCFeature
}
}
5 => FeaturePoint::DJIFlyCustomFeature,
6 => FeaturePoint::BaseFeature,
7 => {
if version == 13 {
FeaturePoint::BaseFeature
} else {
FeaturePoint::BatteryFeature
}
}
8 => {
if version == 13 {
FeaturePoint::BaseFeature
} else {
FeaturePoint::BatteryFeature
}
}
9 => FeaturePoint::DJIFlyCustomFeature,
10 => FeaturePoint::DJIFlyCustomFeature,
11 => {
if version == 13 {
FeaturePoint::BaseFeature
} else {
FeaturePoint::RCFeature
}
}
12 => FeaturePoint::AfterSalesFeature,
13 => FeaturePoint::BaseFeature,
14 => FeaturePoint::BaseFeature,
15 => FeaturePoint::BaseFeature,
16 => FeaturePoint::AfterSalesFeature,
17 => FeaturePoint::VisionFeature,
18 => FeaturePoint::VisionFeature,
19 => FeaturePoint::AfterSalesFeature,
20 => FeaturePoint::DJIFlyCustomFeature,
21 => FeaturePoint::AgricultureFeature,
22 => {
if version == 13 {
FeaturePoint::AfterSalesFeature
} else {
FeaturePoint::BatteryFeature
}
}
24 => FeaturePoint::DJIFlyCustomFeature,
25 => {
if version == 13 {
FeaturePoint::BaseFeature
} else {
FeaturePoint::CameraFeature
}
}
26 => FeaturePoint::AfterSalesFeature,
27 => FeaturePoint::AfterSalesFeature,
28 => {
if version == 13 {
FeaturePoint::AfterSalesFeature
} else {
FeaturePoint::FlySafeFeature
}
}
29 => {
if version == 13 {
FeaturePoint::BaseFeature
} else {
FeaturePoint::RCFeature
}
}
30 => FeaturePoint::DJIFlyCustomFeature,
31 => FeaturePoint::WaypointFeature,
32 => FeaturePoint::WaypointFeature,
33 => {
if version == 13 {
FeaturePoint::BaseFeature
} else {
FeaturePoint::RCFeature
}
}
34 => FeaturePoint::WaypointFeature,
35 => FeaturePoint::WaypointFeature,
36 => FeaturePoint::WaypointFeature,
38 => FeaturePoint::WaypointFeature,
39 => FeaturePoint::WaypointFeature,
40 => FeaturePoint::BaseFeature,
41 => FeaturePoint::AgricultureFeature,
43 => FeaturePoint::AgricultureFeature,
44 => FeaturePoint::AgricultureFeature,
45 => FeaturePoint::AgricultureFeature,
46 => FeaturePoint::AgricultureFeature,
47 => FeaturePoint::AgricultureFeature,
48 => FeaturePoint::AgricultureFeature,
49 => FeaturePoint::AirLinkFeature,
50 => FeaturePoint::PlaintextFeature,
51 => {
if version == 13 {
FeaturePoint::AfterSalesFeature
} else {
FeaturePoint::FlySafeFeature
}
}
52 => {
if version == 13 {
FeaturePoint::AfterSalesFeature
} else {
FeaturePoint::FlySafeFeature
}
}
53 => {
if version == 13 {
FeaturePoint::AfterSalesFeature
} else {
FeaturePoint::FlightHubFeature
}
}
54 => FeaturePoint::DJIFlyCustomFeature,
55 => FeaturePoint::SecurityFeature,
56 => FeaturePoint::PlaintextFeature,
58 => FeaturePoint::BaseFeature,
59 => FeaturePoint::BaseFeature,
62 => FeaturePoint::RCFeature,
63 => FeaturePoint::BaseFeature,
_ => FeaturePoint::PlaintextFeature,
}
}
}
impl Serialize for FeaturePoint {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let feature_point_string = match self {
FeaturePoint::BaseFeature => "FR_Standardization_Feature_Base_1",
FeaturePoint::VisionFeature => "FR_Standardization_Feature_Vision_2",
FeaturePoint::WaypointFeature => "FR_Standardization_Feature_Waypoint_3",
FeaturePoint::AgricultureFeature => "FR_Standardization_Feature_Agriculture_4",
FeaturePoint::AirLinkFeature => "FR_Standardization_Feature_AirLink_5",
FeaturePoint::AfterSalesFeature => "FR_Standardization_Feature_AfterSales_6",
FeaturePoint::DJIFlyCustomFeature => "FR_Standardization_Feature_DJIFlyCustom_7",
FeaturePoint::PlaintextFeature => "FR_Standardization_Feature_Plaintext_8",
FeaturePoint::FlightHubFeature => "FR_Standardization_Feature_FlightHub_9",
FeaturePoint::GimbalFeature => "FR_Standardization_Feature_Gimbal_10",
FeaturePoint::RCFeature => "FR_Standardization_Feature_RC_11",
FeaturePoint::CameraFeature => "FR_Standardization_Feature_Camera_12",
FeaturePoint::BatteryFeature => "FR_Standardization_Feature_Battery_13",
FeaturePoint::FlySafeFeature => "FR_Standardization_Feature_FlySafe_14",
FeaturePoint::SecurityFeature => "FR_Standardization_Feature_Security_15",
};
serializer.serialize_str(feature_point_string)
}
}
impl<'de> Deserialize<'de> for FeaturePoint {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
match s.as_str() {
"FR_Standardization_Feature_Base_1" => Ok(FeaturePoint::BaseFeature),
"FR_Standardization_Feature_Vision_2" => Ok(FeaturePoint::VisionFeature),
"FR_Standardization_Feature_Waypoint_3" => Ok(FeaturePoint::WaypointFeature),
"FR_Standardization_Feature_Agriculture_4" => Ok(FeaturePoint::AgricultureFeature),
"FR_Standardization_Feature_AirLink_5" => Ok(FeaturePoint::AirLinkFeature),
"FR_Standardization_Feature_AfterSales_6" => Ok(FeaturePoint::AfterSalesFeature),
"FR_Standardization_Feature_DJIFlyCustom_7" => Ok(FeaturePoint::DJIFlyCustomFeature),
"FR_Standardization_Feature_Plaintext_8" => Ok(FeaturePoint::PlaintextFeature),
"FR_Standardization_Feature_FlightHub_9" => Ok(FeaturePoint::FlightHubFeature),
"FR_Standardization_Feature_Gimbal_10" => Ok(FeaturePoint::GimbalFeature),
"FR_Standardization_Feature_RC_11" => Ok(FeaturePoint::RCFeature),
"FR_Standardization_Feature_Camera_12" => Ok(FeaturePoint::CameraFeature),
"FR_Standardization_Feature_Battery_13" => Ok(FeaturePoint::BatteryFeature),
"FR_Standardization_Feature_FlySafe_14" => Ok(FeaturePoint::FlySafeFeature),
"FR_Standardization_Feature_Security_15" => Ok(FeaturePoint::SecurityFeature),
_ => Err(serde::de::Error::custom(format!(
"Invalid feature point: {}",
s
))),
}
}
}