extern crate failure;
extern crate serde;
extern crate serde_derive;
extern crate serde_json;
extern crate tokio_dns;
extern crate tokio_tcp;
extern crate tokio_tungstenite;
extern crate tungstenite;
#[cfg(feature = "logging")]
pub mod logging;
pub mod registration;
pub mod socket;
pub use crate::registration::RegistrationInfo;
pub use crate::socket::StreamDeckSocket;
use serde::{de, ser};
use serde_derive::{Deserialize, Serialize};
use std::fmt;
#[derive(Debug, Deserialize)]
#[serde(tag = "event", rename_all = "camelCase")]
pub enum Message<G, S, M> {
#[serde(rename_all = "camelCase")]
KeyDown {
action: String,
context: String,
device: String,
payload: KeyPayload<S>,
},
#[serde(rename_all = "camelCase")]
KeyUp {
action: String,
context: String,
device: String,
payload: KeyPayload<S>,
},
#[serde(rename_all = "camelCase")]
WillAppear {
action: String,
context: String,
device: Option<String>,
payload: VisibilityPayload<S>,
},
#[serde(rename_all = "camelCase")]
WillDisappear {
action: String,
context: String,
device: Option<String>,
payload: VisibilityPayload<S>,
},
#[serde(rename_all = "camelCase")]
TitleParametersDidChange {
action: String,
context: String,
device: Option<String>,
payload: TitleParametersPayload<S>,
},
#[serde(rename_all = "camelCase")]
DeviceDidConnect {
device: String,
device_info: DeviceInfo,
},
#[serde(rename_all = "camelCase")]
DeviceDidDisconnect {
device: String,
},
#[serde(rename_all = "camelCase")]
ApplicationDidLaunch {
payload: ApplicationPayload,
},
#[serde(rename_all = "camelCase")]
ApplicationDidTerminate {
payload: ApplicationPayload,
},
#[serde(rename_all = "camelCase")]
SendToPlugin {
action: String,
context: String,
payload: M,
},
#[serde(rename_all = "camelCase")]
DidReceiveSettings {
action: String,
context: String,
device: String,
payload: KeyPayload<S>,
},
#[serde(rename_all = "camelCase")]
PropertyInspectorDidAppear {
action: String,
context: String,
device: String,
},
#[serde(rename_all = "camelCase")]
PropertyInspectorDidDisappear {
action: String,
context: String,
device: String,
},
#[serde(rename_all = "camelCase")]
DidReceiveGlobalSettings {
payload: GlobalSettingsPayload<G>,
},
SystemDidWakeUp,
#[serde(other)]
Unknown,
}
#[derive(Debug, Serialize)]
#[serde(tag = "event", rename_all = "camelCase")]
pub enum MessageOut<G, S, M> {
#[serde(rename_all = "camelCase")]
SetTitle {
context: String,
payload: TitlePayload,
},
#[serde(rename_all = "camelCase")]
SetImage {
context: String,
payload: ImagePayload,
},
#[serde(rename_all = "camelCase")]
ShowAlert {
context: String,
},
#[serde(rename_all = "camelCase")]
ShowOk {
context: String,
},
#[serde(rename_all = "camelCase")]
GetSettings {
context: String,
},
#[serde(rename_all = "camelCase")]
SetSettings {
context: String,
payload: S,
},
#[serde(rename_all = "camelCase")]
SetState {
context: String,
payload: StatePayload,
},
#[serde(rename_all = "camelCase")]
SendToPropertyInspector {
action: String,
context: String,
payload: M,
},
#[serde(rename_all = "camelCase")]
SwitchToProfile {
context: String,
device: String,
payload: ProfilePayload,
},
#[serde(rename_all = "camelCase")]
OpenUrl {
payload: UrlPayload,
},
#[serde(rename_all = "camelCase")]
GetGlobalSettings {
context: String,
},
#[serde(rename_all = "camelCase")]
SetGlobalSettings {
context: String,
payload: G,
},
#[serde(rename_all = "camelCase")]
LogMessage {
payload: LogMessagePayload,
},
}
#[derive(Debug)]
pub enum Target {
Both, Hardware, Software, }
impl ser::Serialize for Target {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: ser::Serializer,
{
serializer.serialize_u8(match self {
Target::Both => 0,
Target::Hardware => 1,
Target::Software => 2,
})
}
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct TitlePayload {
pub title: Option<String>,
pub target: Target,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ImagePayload {
pub image: Option<String>,
pub target: Target,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct StatePayload {
pub state: u8,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ProfilePayload {
pub profile: String,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct UrlPayload {
pub url: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct KeyPayload<S> {
pub settings: S,
pub coordinates: Option<Coordinates>,
pub state: u8,
pub user_desired_state: Option<u8>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VisibilityPayload<S> {
pub settings: S,
pub coordinates: Option<Coordinates>,
pub state: u8,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TitleParametersPayload<S> {
pub settings: S,
pub coordinates: Coordinates,
pub state: Option<u8>,
pub title: String,
pub title_parameters: TitleParameters,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct GlobalSettingsPayload<G> {
pub settings: G,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct LogMessagePayload {
pub message: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DeviceInfo {
pub name: Option<String>,
pub size: DeviceSize,
#[serde(rename = "type")]
pub _type: Option<DeviceType>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ApplicationPayload {
pub application: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Coordinates {
pub column: u8,
pub row: u8,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum Alignment {
Top,
Middle,
Bottom,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TitleParameters {
pub font_family: String,
pub font_size: u8,
pub font_style: String,
pub font_underline: bool,
pub show_title: bool,
pub title_alignment: Alignment,
pub title_color: String,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct DeviceSize {
pub columns: u8,
pub rows: u8,
}
#[derive(Debug)]
pub enum DeviceType {
StreamDeck,
StreamDeckMini,
StreamDeckXl,
StreamDeckMobile,
Unknown(u64),
}
impl<'de> de::Deserialize<'de> for DeviceType {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: de::Deserializer<'de>,
{
struct Visitor;
impl<'de> de::Visitor<'de> for Visitor {
type Value = DeviceType;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("an integer")
}
fn visit_u64<E>(self, value: u64) -> Result<DeviceType, E>
where
E: de::Error,
{
Ok(match value {
0 => DeviceType::StreamDeck,
1 => DeviceType::StreamDeckMini,
value => DeviceType::Unknown(value),
})
}
}
deserializer.deserialize_u64(Visitor)
}
}