gproxy-protocol 3.0.0-alpha.0

GPROXY v3 protocol model: operation taxonomy, wire kinds, and the OperationSpec registry
Documentation
use serde::{Deserialize, Serialize};

macro_rules! extensible_string {
    ($name:ident, $known:ident { $($variant:ident => $wire:literal),+ $(,)? }) => {
        #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
        #[serde(untagged)]
        pub enum $name {
            Known($known),
            Unknown(String),
        }

        #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
        pub enum $known {
            $(#[serde(rename = $wire)] $variant),+
        }
    };
}

extensible_string!(VideoModelId, KnownVideoModelId {
    Sora2 => "sora-2",
    Sora2Pro => "sora-2-pro",
});
extensible_string!(VideoSeconds, KnownVideoSeconds {
    Four => "4", Eight => "8", Twelve => "12",
});
extensible_string!(VideoExtensionSeconds, KnownVideoExtensionSeconds {
    Four => "4", Eight => "8", Twelve => "12", Sixteen => "16", Twenty => "20",
});
extensible_string!(VideoSize, KnownVideoSize {
    Portrait720x1280 => "720x1280",
    Landscape1280x720 => "1280x720",
    Portrait1024x1792 => "1024x1792",
    Landscape1792x1024 => "1792x1024",
});
extensible_string!(VideoContentVariant, KnownVideoContentVariant {
    Video => "video", Thumbnail => "thumbnail", Spritesheet => "spritesheet",
});
extensible_string!(VideoListOrder, KnownVideoListOrder {
    Asc => "asc", Desc => "desc",
});
extensible_string!(VideoStatus, KnownVideoStatus {
    Queued => "queued", InProgress => "in_progress", Completed => "completed", Failed => "failed",
});
extensible_string!(VideoObjectType, KnownVideoObjectType {
    Video => "video",
});
extensible_string!(VideoDeletedObjectType, KnownVideoDeletedObjectType {
    VideoDeleted => "video.deleted",
});
extensible_string!(VideoListObjectType, KnownVideoListObjectType {
    List => "list",
});