blackmagic-camera-control 0.2.2

Interface with your Blackmagic camera over Bluetooth Low Energy in Rust
Documentation
use serde::{Deserialize, Serialize};

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BlackmagicCameraProtocol {
    pub information: Information,
    pub groups: Vec<Group>,
    #[serde(rename = "bluetooth_services")]
    pub bluetooth_services: Vec<BluetoothService>,
}

impl BlackmagicCameraProtocol {
    pub fn new() -> Result<BlackmagicCameraProtocol, std::io::Error> {
        let data = include_str!("../PROTOCOL.json");
        let cfg: BlackmagicCameraProtocol = serde_json::from_str(&data)?;
        Ok(cfg)
    }
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Information {
    pub readme: String,
    pub source: String,
    pub git: String,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Group {
    pub name: String,
    #[serde(rename = "normalized_name")]
    pub normalized_name: String,
    pub id: i64,
    pub parameters: Vec<Parameter>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Parameter {
    pub id: i64,
    pub group: String,
    #[serde(rename = "group_id")]
    pub group_id: i64,
    pub parameter: String,
    #[serde(rename = "normalized_parameter")]
    pub normalized_parameter: String,
    #[serde(rename = "type")]
    pub type_field: String,
    pub index: Vec<String>,
    pub interpretation: Option<String>,
    pub minimum: Option<f64>,
    pub maximum: Option<f64>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BluetoothService {
    pub name: String,
    #[serde(rename = "normalized_name")]
    pub normalized_name: String,
    pub uuid: uuid::Uuid,
    pub characteristics: Vec<Characteristic>,
}

#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Characteristic {
    pub name: String,
    #[serde(rename = "normalized_name")]
    pub normalized_name: String,
    pub uuid: uuid::Uuid,
    pub description: Option<String>,
    pub decription: Option<String>,
}