use crate::connection::{HttpBody, MultipartPart};
use crate::{Rest, WireRequest, WireResponse};
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
fn optional<'de, D, T>(d: D) -> Result<Option<T>, D::Error>
where
D: serde::Deserializer<'de>,
T: Deserialize<'de>,
{
T::deserialize(d).map(Some)
}
fn nullable<'de, D, T>(d: D) -> Result<Option<Option<T>>, D::Error>
where
D: serde::Deserializer<'de>,
T: Deserialize<'de>,
{
Option::<T>::deserialize(d).map(Some)
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct CreateVideoRequestBody {
pub model: String,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub prompt: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub duration: Option<i64>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub aspect_ratio: Option<VideoAspectRatio>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub resolution: Option<VideoResolution>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub size: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub seed: Option<i64>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub frame_images: Option<Vec<FrameImage>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub input_references: Option<Vec<InputReference>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub generate_audio: Option<bool>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub callback_url: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub provider: Option<VideoProvider>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct VideoGenerationResponseBody {
pub id: String,
pub polling_url: String,
pub status: VideoStatus,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub error: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub generation_id: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub unsigned_urls: Option<Vec<String>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub usage: Option<VideoUsage>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct VideoUsage {
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub cost: Option<Option<serde_json::Number>>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub is_byok: Option<bool>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct VideoProvider {
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub options: Option<BTreeMap<String, Rest>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct ReferenceUrl {
pub url: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct FrameImage {
#[serde(rename = "type")]
pub type_: VideoImageType,
pub image_url: ReferenceUrl,
pub frame_type: FrameType,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum VideoImageType {
#[serde(rename = "image_url")]
ImageUrl,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum FrameType {
#[serde(rename = "first_frame")]
FirstFrame,
#[serde(rename = "last_frame")]
LastFrame,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type")]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum InputReference {
#[serde(rename = "image_url")]
Image(InputImageReference),
#[serde(rename = "audio_url")]
Audio(InputAudioReference),
#[serde(rename = "video_url")]
Video(InputVideoReference),
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct InputImageReference {
pub image_url: ReferenceUrl,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct InputAudioReference {
pub audio_url: ReferenceUrl,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct InputVideoReference {
pub video_url: ReferenceUrl,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum VideoAspectRatio {
#[serde(rename = "16:9")]
R16x9,
#[serde(rename = "9:16")]
R9x16,
#[serde(rename = "1:1")]
R1x1,
#[serde(rename = "4:3")]
R4x3,
#[serde(rename = "3:4")]
R3x4,
#[serde(rename = "3:2")]
R3x2,
#[serde(rename = "2:3")]
R2x3,
#[serde(rename = "21:9")]
R21x9,
#[serde(rename = "9:21")]
R9x21,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum VideoResolution {
#[serde(rename = "480p")]
P480,
#[serde(rename = "720p")]
P720,
#[serde(rename = "768p")]
P768,
#[serde(rename = "1080p")]
P1080,
#[serde(rename = "1K")]
K1,
#[serde(rename = "2K")]
K2,
#[serde(rename = "4K")]
K4,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum VideoStatus {
#[serde(rename = "pending")]
Pending,
#[serde(rename = "in_progress")]
InProgress,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "failed")]
Failed,
#[serde(rename = "cancelled")]
Cancelled,
#[serde(rename = "expired")]
Expired,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct RetrieveVideoPath {
#[serde(rename = "jobId")]
pub job_id: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct DownloadVideoQuery {
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub index: Option<Option<i64>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
pub type CreateVideoRequest = WireRequest<CreateVideoRequestBody>;
pub type CreateVideoResponse = WireResponse<VideoGenerationResponseBody>;
pub type RetrieveVideoRequest = WireRequest<()>;
pub type RetrieveVideoResponse = WireResponse<VideoGenerationResponseBody>;
pub type DownloadVideoRequest = WireRequest<()>;
pub type DownloadVideoResponse = WireResponse<HttpBody>;
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeCreateVideoRequestBody {
pub prompt: String,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub input_reference: Option<NativeInputReference>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub model: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub seconds: Option<NativeVideoSeconds>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub size: Option<NativeVideoSize>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(Debug, gproxy_protocol_macros::WireBuilder)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeCreateVideoMultipartForm {
pub prompt: String,
pub input_reference: Option<MultipartPart>,
pub model: Option<String>,
pub seconds: Option<NativeVideoSeconds>,
pub size: Option<NativeVideoSize>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(untagged)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum NativeInputReference {
File(NativeFileReference),
Url(NativeUrlReference),
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeFileReference {
pub file_id: String,
#[serde(
default,
flatten,
deserialize_with = "file_extensions",
skip_serializing_if = "serde_json::Map::is_empty"
)]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeUrlReference {
pub image_url: String,
#[serde(
default,
flatten,
deserialize_with = "url_extensions",
skip_serializing_if = "serde_json::Map::is_empty"
)]
pub rest: Rest,
}
fn file_extensions<'de, D: serde::Deserializer<'de>>(d: D) -> Result<Rest, D::Error> {
let rest = Rest::deserialize(d)?;
if rest.contains_key("image_url") {
return Err(serde::de::Error::custom(
"reference requires exactly one of file_id and image_url",
));
}
Ok(rest)
}
fn url_extensions<'de, D: serde::Deserializer<'de>>(d: D) -> Result<Rest, D::Error> {
let rest = Rest::deserialize(d)?;
if rest.contains_key("file_id") {
return Err(serde::de::Error::custom(
"reference requires exactly one of file_id and image_url",
));
}
Ok(rest)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum NativeVideoSeconds {
#[serde(rename = "4")]
Four,
#[serde(rename = "8")]
Eight,
#[serde(rename = "12")]
Twelve,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum NativeVideoSize {
#[serde(rename = "720x1280")]
Portrait720,
#[serde(rename = "1280x720")]
Landscape720,
#[serde(rename = "1024x1792")]
Portrait1024,
#[serde(rename = "1792x1024")]
Landscape1024,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum NativeVideoStatus {
#[serde(rename = "queued")]
Queued,
#[serde(rename = "in_progress")]
InProgress,
#[serde(rename = "completed")]
Completed,
#[serde(rename = "failed")]
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum NativeVideoObject {
#[serde(rename = "video")]
Video,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum NativeVideoDeletedObject {
#[serde(rename = "video.deleted")]
VideoDeleted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum NativeVideoListOrder {
#[serde(rename = "asc")]
Asc,
#[serde(rename = "desc")]
Desc,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub enum NativeVideoDownloadVariant {
#[serde(rename = "video")]
Video,
#[serde(rename = "thumbnail")]
Thumbnail,
#[serde(rename = "spritesheet")]
Spritesheet,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeVideo {
pub id: String,
pub created_at: i64,
pub model: String,
pub object: NativeVideoObject,
pub progress: i64,
pub seconds: String,
pub size: NativeVideoSize,
pub status: NativeVideoStatus,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub completed_at: Option<Option<i64>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub error: Option<Option<NativeVideoError>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub expires_at: Option<Option<i64>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub prompt: Option<Option<String>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub remixed_from_video_id: Option<Option<String>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeVideoError {
pub code: String,
pub message: String,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub misalignment: Option<Option<NativeVideoMisalignment>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeVideoPath {
pub video_id: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeListVideosQuery {
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub after: Option<String>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub limit: Option<i64>,
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub order: Option<NativeVideoListOrder>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeListVideosResponseBody {
pub data: Vec<NativeVideo>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub has_more: Option<Option<bool>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub last_id: Option<Option<String>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeDeleteVideoResponseBody {
pub id: String,
pub deleted: bool,
pub object: NativeVideoDeletedObject,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeDownloadVideoQuery {
#[serde(
default,
deserialize_with = "optional",
skip_serializing_if = "Option::is_none"
)]
pub variant: Option<NativeVideoDownloadVariant>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
pub type NativeCreateVideoRequest = WireRequest<NativeCreateVideoRequestBody>;
pub type NativeCreateVideoMultipartRequest = WireRequest<NativeCreateVideoMultipartForm>;
pub type NativeRawCreateVideoRequest = WireRequest<crate::connection::Multipart>;
pub type NativeCreateVideoResponse = WireResponse<NativeVideo>;
pub type NativeRetrieveVideoRequest = WireRequest<()>;
pub type NativeRetrieveVideoResponse = WireResponse<NativeVideo>;
pub type NativeListVideosRequest = WireRequest<()>;
pub type NativeListVideosResponse = WireResponse<NativeListVideosResponseBody>;
pub type NativeDeleteVideoRequest = WireRequest<()>;
pub type NativeDeleteVideoResponse = WireResponse<NativeDeleteVideoResponseBody>;
pub type NativeDownloadVideoRequest = WireRequest<()>;
pub type NativeDownloadVideoResponse = WireResponse<HttpBody>;
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeVideoMisalignment {
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub detailed_explanation: Option<Option<String>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub error_type: Option<Option<String>>,
#[serde(
default,
deserialize_with = "nullable",
skip_serializing_if = "Option::is_none"
)]
pub steer: Option<Option<NativeVideoSteer>>,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}
#[derive(
Debug, Clone, PartialEq, Eq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder,
)]
#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
#[derive(gproxy_protocol_macros::DeclaredFields)]
pub struct NativeVideoSteer {
pub message: String,
#[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
pub rest: Rest,
}