Skip to main content

gproxy_protocol/protocol/gemini/common/
enums.rs

1use serde::{Deserialize, Serialize};
2
3macro_rules! extensible_string_enum {
4    ($outer:ident, $known:ident { $first_variant:ident => $first_wire:literal $(, $variant:ident => $wire:literal)* $(,)? }) => {
5        #[derive(Debug, Clone, PartialEq, Eq, Serialize)]
6        #[serde(untagged)]
7        pub enum $outer {
8            Known($known),
9            Unknown(String),
10        }
11
12        // Manual Deserialize: a known-variant miss falls back to `Unknown`
13        // without ever formatting an unknown-variant error (see
14        // `protocol::extensible`).
15        impl<'de> serde::Deserialize<'de> for $outer {
16            fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
17                crate::protocol::extensible::deserialize_extensible(d, Self::Known, Self::Unknown)
18            }
19        }
20
21        #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
22        pub enum $known {
23            #[serde(rename = $first_wire)]
24            $first_variant,
25            $(
26                #[serde(rename = $wire)]
27                $variant,
28            )*
29        }
30
31        impl Default for $outer {
32            fn default() -> Self {
33                Self::Known($known::$first_variant)
34            }
35        }
36    };
37}
38
39extensible_string_enum!(ContentRole, ContentRoleKnown {
40    User => "user",
41    Model => "model",
42    System => "system",
43    Function => "function",
44});
45
46extensible_string_enum!(Modality, ModalityKnown {
47    ModalityUnspecified => "MODALITY_UNSPECIFIED",
48    Text => "TEXT",
49    Image => "IMAGE",
50    Video => "VIDEO",
51    Audio => "AUDIO",
52    Document => "DOCUMENT",
53});
54
55extensible_string_enum!(ResponseModality, ResponseModalityKnown {
56    ModalityUnspecified => "MODALITY_UNSPECIFIED",
57    Text => "TEXT",
58    Image => "IMAGE",
59    Audio => "AUDIO",
60});
61
62extensible_string_enum!(ResponseMimeType, ResponseMimeTypeKnown {
63    TextPlain => "text/plain",
64    ApplicationJson => "application/json",
65    TextXEnum => "text/x.enum",
66});
67
68extensible_string_enum!(HarmCategory, HarmCategoryKnown {
69    HarmCategoryUnspecified => "HARM_CATEGORY_UNSPECIFIED",
70    HarmCategoryDerogatory => "HARM_CATEGORY_DEROGATORY",
71    HarmCategoryToxicity => "HARM_CATEGORY_TOXICITY",
72    HarmCategoryViolence => "HARM_CATEGORY_VIOLENCE",
73    HarmCategorySexual => "HARM_CATEGORY_SEXUAL",
74    HarmCategoryMedical => "HARM_CATEGORY_MEDICAL",
75    HarmCategoryDangerous => "HARM_CATEGORY_DANGEROUS",
76    HarmCategoryHarassment => "HARM_CATEGORY_HARASSMENT",
77    HarmCategoryHateSpeech => "HARM_CATEGORY_HATE_SPEECH",
78    HarmCategorySexuallyExplicit => "HARM_CATEGORY_SEXUALLY_EXPLICIT",
79    HarmCategoryDangerousContent => "HARM_CATEGORY_DANGEROUS_CONTENT",
80    HarmCategoryCivicIntegrity => "HARM_CATEGORY_CIVIC_INTEGRITY",
81});
82
83extensible_string_enum!(HarmBlockThreshold, HarmBlockThresholdKnown {
84    HarmBlockThresholdUnspecified => "HARM_BLOCK_THRESHOLD_UNSPECIFIED",
85    BlockLowAndAbove => "BLOCK_LOW_AND_ABOVE",
86    BlockMediumAndAbove => "BLOCK_MEDIUM_AND_ABOVE",
87    BlockOnlyHigh => "BLOCK_ONLY_HIGH",
88    BlockNone => "BLOCK_NONE",
89    Off => "OFF",
90});
91
92extensible_string_enum!(HarmProbability, HarmProbabilityKnown {
93    HarmProbabilityUnspecified => "HARM_PROBABILITY_UNSPECIFIED",
94    Negligible => "NEGLIGIBLE",
95    Low => "LOW",
96    Medium => "MEDIUM",
97    High => "HIGH",
98});
99
100extensible_string_enum!(ServiceTier, ServiceTierKnown {
101    Unspecified => "unspecified",
102    Standard => "standard",
103    Flex => "flex",
104    Priority => "priority",
105});
106
107extensible_string_enum!(FinishReason, FinishReasonKnown {
108    FinishReasonUnspecified => "FINISH_REASON_UNSPECIFIED",
109    Stop => "STOP",
110    MaxTokens => "MAX_TOKENS",
111    Safety => "SAFETY",
112    Recitation => "RECITATION",
113    Language => "LANGUAGE",
114    Other => "OTHER",
115    Blocklist => "BLOCKLIST",
116    ProhibitedContent => "PROHIBITED_CONTENT",
117    Spii => "SPII",
118    MalformedFunctionCall => "MALFORMED_FUNCTION_CALL",
119    ImageSafety => "IMAGE_SAFETY",
120    ImageProhibitedContent => "IMAGE_PROHIBITED_CONTENT",
121    ImageOther => "IMAGE_OTHER",
122    NoImage => "NO_IMAGE",
123    ImageRecitation => "IMAGE_RECITATION",
124    UnexpectedToolCall => "UNEXPECTED_TOOL_CALL",
125    TooManyToolCalls => "TOO_MANY_TOOL_CALLS",
126    MissingThoughtSignature => "MISSING_THOUGHT_SIGNATURE",
127    MalformedResponse => "MALFORMED_RESPONSE",
128});
129
130extensible_string_enum!(BlockReason, BlockReasonKnown {
131    BlockReasonUnspecified => "BLOCK_REASON_UNSPECIFIED",
132    Safety => "SAFETY",
133    Other => "OTHER",
134    Blocklist => "BLOCKLIST",
135    ProhibitedContent => "PROHIBITED_CONTENT",
136    ImageSafety => "IMAGE_SAFETY",
137});
138
139extensible_string_enum!(ModelStage, ModelStageKnown {
140    ModelStageUnspecified => "MODEL_STAGE_UNSPECIFIED",
141    UnstableExperimental => "UNSTABLE_EXPERIMENTAL",
142    Experimental => "EXPERIMENTAL",
143    Preview => "PREVIEW",
144    Stable => "STABLE",
145    Legacy => "LEGACY",
146    Deprecated => "DEPRECATED",
147    Retired => "RETIRED",
148});
149
150extensible_string_enum!(TaskType, TaskTypeKnown {
151    TaskTypeUnspecified => "TASK_TYPE_UNSPECIFIED",
152    RetrievalQuery => "RETRIEVAL_QUERY",
153    RetrievalDocument => "RETRIEVAL_DOCUMENT",
154    SemanticSimilarity => "SEMANTIC_SIMILARITY",
155    Classification => "CLASSIFICATION",
156    Clustering => "CLUSTERING",
157    QuestionAnswering => "QUESTION_ANSWERING",
158    FactVerification => "FACT_VERIFICATION",
159    CodeRetrievalQuery => "CODE_RETRIEVAL_QUERY",
160});
161
162extensible_string_enum!(MediaResolutionLevel, MediaResolutionLevelKnown {
163    MediaResolutionUnspecified => "MEDIA_RESOLUTION_UNSPECIFIED",
164    MediaResolutionLow => "MEDIA_RESOLUTION_LOW",
165    MediaResolutionMedium => "MEDIA_RESOLUTION_MEDIUM",
166    MediaResolutionHigh => "MEDIA_RESOLUTION_HIGH",
167    MediaResolutionUltraHigh => "MEDIA_RESOLUTION_ULTRA_HIGH",
168});
169
170extensible_string_enum!(GenerationMediaResolution, GenerationMediaResolutionKnown {
171    MediaResolutionUnspecified => "MEDIA_RESOLUTION_UNSPECIFIED",
172    MediaResolutionLow => "MEDIA_RESOLUTION_LOW",
173    MediaResolutionMedium => "MEDIA_RESOLUTION_MEDIUM",
174    MediaResolutionHigh => "MEDIA_RESOLUTION_HIGH",
175});
176
177extensible_string_enum!(ThinkingLevel, ThinkingLevelKnown {
178    ThinkingLevelUnspecified => "THINKING_LEVEL_UNSPECIFIED",
179    Minimal => "MINIMAL",
180    Low => "LOW",
181    Medium => "MEDIUM",
182    High => "HIGH",
183});
184
185extensible_string_enum!(FunctionResponseScheduling, FunctionResponseSchedulingKnown {
186    SchedulingUnspecified => "SCHEDULING_UNSPECIFIED",
187    Silent => "SILENT",
188    WhenIdle => "WHEN_IDLE",
189    Interrupt => "INTERRUPT",
190});
191
192extensible_string_enum!(ExecutableCodeLanguage, ExecutableCodeLanguageKnown {
193    LanguageUnspecified => "LANGUAGE_UNSPECIFIED",
194    Python => "PYTHON",
195});
196
197extensible_string_enum!(CodeExecutionOutcome, CodeExecutionOutcomeKnown {
198    OutcomeUnspecified => "OUTCOME_UNSPECIFIED",
199    OutcomeOk => "OUTCOME_OK",
200    OutcomeFailed => "OUTCOME_FAILED",
201    OutcomeDeadlineExceeded => "OUTCOME_DEADLINE_EXCEEDED",
202});
203
204extensible_string_enum!(ServerToolType, ServerToolTypeKnown {
205    ToolTypeUnspecified => "TOOL_TYPE_UNSPECIFIED",
206    GoogleSearchWeb => "GOOGLE_SEARCH_WEB",
207    GoogleSearchImage => "GOOGLE_SEARCH_IMAGE",
208    UrlContext => "URL_CONTEXT",
209    GoogleMaps => "GOOGLE_MAPS",
210    FileSearch => "FILE_SEARCH",
211});
212
213extensible_string_enum!(SchemaType, SchemaTypeKnown {
214    TypeUnspecified => "TYPE_UNSPECIFIED",
215    String => "STRING",
216    Number => "NUMBER",
217    Integer => "INTEGER",
218    Boolean => "BOOLEAN",
219    Array => "ARRAY",
220    Object => "OBJECT",
221    Null => "NULL",
222});
223
224extensible_string_enum!(FunctionBehavior, FunctionBehaviorKnown {
225    Unspecified => "UNSPECIFIED",
226    Blocking => "BLOCKING",
227    NonBlocking => "NON_BLOCKING",
228});
229
230extensible_string_enum!(DynamicRetrievalMode, DynamicRetrievalModeKnown {
231    ModeUnspecified => "MODE_UNSPECIFIED",
232    ModeDynamic => "MODE_DYNAMIC",
233});
234
235extensible_string_enum!(FunctionCallingMode, FunctionCallingModeKnown {
236    ModeUnspecified => "MODE_UNSPECIFIED",
237    Auto => "AUTO",
238    Any => "ANY",
239    None => "NONE",
240    Validated => "VALIDATED",
241});
242
243extensible_string_enum!(ComputerUseEnvironment, ComputerUseEnvironmentKnown {
244    EnvironmentUnspecified => "ENVIRONMENT_UNSPECIFIED",
245    EnvironmentBrowser => "ENVIRONMENT_BROWSER",
246});
247
248extensible_string_enum!(UrlRetrievalStatus, UrlRetrievalStatusKnown {
249    UrlRetrievalStatusUnspecified => "URL_RETRIEVAL_STATUS_UNSPECIFIED",
250    UrlRetrievalStatusSuccess => "URL_RETRIEVAL_STATUS_SUCCESS",
251    UrlRetrievalStatusError => "URL_RETRIEVAL_STATUS_ERROR",
252    UrlRetrievalStatusPaywall => "URL_RETRIEVAL_STATUS_PAYWALL",
253    UrlRetrievalStatusUnsafe => "URL_RETRIEVAL_STATUS_UNSAFE",
254});
255
256extensible_string_enum!(SupportedGenerationMethod, SupportedGenerationMethodKnown {
257    GenerateMessage => "generateMessage",
258    GenerateContent => "generateContent",
259    StreamGenerateContent => "streamGenerateContent",
260    CountTokens => "countTokens",
261    EmbedContent => "embedContent",
262    BatchEmbedContents => "batchEmbedContents",
263});
264
265extensible_string_enum!(BatchState, BatchStateKnown {
266    BatchStateUnspecified => "BATCH_STATE_UNSPECIFIED",
267    BatchStatePending => "BATCH_STATE_PENDING",
268    BatchStateRunning => "BATCH_STATE_RUNNING",
269    BatchStateSucceeded => "BATCH_STATE_SUCCEEDED",
270    BatchStateFailed => "BATCH_STATE_FAILED",
271    BatchStateCancelled => "BATCH_STATE_CANCELLED",
272    BatchStateExpired => "BATCH_STATE_EXPIRED",
273});
274
275extensible_string_enum!(ImageAspectRatio, ImageAspectRatioKnown {
276    OneToOne => "1:1",
277    OneToFour => "1:4",
278    FourToOne => "4:1",
279    OneToEight => "1:8",
280    EightToOne => "8:1",
281    TwoToThree => "2:3",
282    ThreeToTwo => "3:2",
283    ThreeToFour => "3:4",
284    FourToThree => "4:3",
285    FourToFive => "4:5",
286    FiveToFour => "5:4",
287    NineToSixteen => "9:16",
288    SixteenToNine => "16:9",
289    TwentyOneToNine => "21:9",
290});
291
292extensible_string_enum!(ImageSize, ImageSizeKnown {
293    Size512 => "512",
294    Size1K => "1K",
295    Size2K => "2K",
296    Size4K => "4K",
297});
298
299extensible_string_enum!(TextResponseFormatMimeType, TextResponseFormatMimeTypeKnown {
300    MimeTypeUnspecified => "MIME_TYPE_UNSPECIFIED",
301    ApplicationJson => "APPLICATION_JSON",
302    TextPlain => "TEXT_PLAIN",
303});
304
305extensible_string_enum!(AudioResponseFormatMimeType, AudioResponseFormatMimeTypeKnown {
306    MimeTypeUnspecified => "MIME_TYPE_UNSPECIFIED",
307    AudioMp3 => "AUDIO_MP3",
308    AudioOggOpus => "AUDIO_OGG_OPUS",
309    AudioL16 => "AUDIO_L16",
310    AudioWav => "AUDIO_WAV",
311    AudioAlaw => "AUDIO_ALAW",
312    AudioMulaw => "AUDIO_MULAW",
313});
314
315extensible_string_enum!(AudioResponseDelivery, AudioResponseDeliveryKnown {
316    DeliveryUnspecified => "DELIVERY_UNSPECIFIED",
317    Inline => "INLINE",
318    Uri => "URI",
319});
320
321extensible_string_enum!(ImageResponseFormatMimeType, ImageResponseFormatMimeTypeKnown {
322    MimeTypeUnspecified => "MIME_TYPE_UNSPECIFIED",
323    ImageJpeg => "IMAGE_JPEG",
324});
325
326extensible_string_enum!(ImageResponseDelivery, ImageResponseDeliveryKnown {
327    DeliveryUnspecified => "DELIVERY_UNSPECIFIED",
328    Inline => "INLINE",
329    Uri => "URI",
330});
331
332extensible_string_enum!(ImageResponseAspectRatio, ImageResponseAspectRatioKnown {
333    AspectRatioUnspecified => "ASPECT_RATIO_UNSPECIFIED",
334    AspectRatioOneByOne => "ASPECT_RATIO_ONE_BY_ONE",
335    AspectRatioTwoByThree => "ASPECT_RATIO_TWO_BY_THREE",
336    AspectRatioThreeByTwo => "ASPECT_RATIO_THREE_BY_TWO",
337    AspectRatioThreeByFour => "ASPECT_RATIO_THREE_BY_FOUR",
338    AspectRatioFourByThree => "ASPECT_RATIO_FOUR_BY_THREE",
339    AspectRatioFourByFive => "ASPECT_RATIO_FOUR_BY_FIVE",
340    AspectRatioFiveByFour => "ASPECT_RATIO_FIVE_BY_FOUR",
341    AspectRatioNineBySixteen => "ASPECT_RATIO_NINE_BY_SIXTEEN",
342    AspectRatioSixteenByNine => "ASPECT_RATIO_SIXTEEN_BY_NINE",
343    AspectRatioTwentyOneByNine => "ASPECT_RATIO_TWENTY_ONE_BY_NINE",
344    AspectRatioOneByEight => "ASPECT_RATIO_ONE_BY_EIGHT",
345    AspectRatioEightByOne => "ASPECT_RATIO_EIGHT_BY_ONE",
346    AspectRatioOneByFour => "ASPECT_RATIO_ONE_BY_FOUR",
347    AspectRatioFourByOne => "ASPECT_RATIO_FOUR_BY_ONE",
348});
349
350extensible_string_enum!(ImageResponseSize, ImageResponseSizeKnown {
351    ImageSizeUnspecified => "IMAGE_SIZE_UNSPECIFIED",
352    ImageSizeFiveTwelve => "IMAGE_SIZE_FIVE_TWELVE",
353    ImageSizeOneK => "IMAGE_SIZE_ONE_K",
354    ImageSizeTwoK => "IMAGE_SIZE_TWO_K",
355    ImageSizeFourK => "IMAGE_SIZE_FOUR_K",
356});
357
358extensible_string_enum!(SpeechLanguageCode, SpeechLanguageCodeKnown {
359    DeDe => "de-DE",
360    EnAu => "en-AU",
361    EnGb => "en-GB",
362    EnIn => "en-IN",
363    EnUs => "en-US",
364    EsUs => "es-US",
365    FrFr => "fr-FR",
366    HiIn => "hi-IN",
367    PtBr => "pt-BR",
368    ArXa => "ar-XA",
369    EsEs => "es-ES",
370    FrCa => "fr-CA",
371    IdId => "id-ID",
372    ItIt => "it-IT",
373    JaJp => "ja-JP",
374    TrTr => "tr-TR",
375    ViVn => "vi-VN",
376    BnIn => "bn-IN",
377    GuIn => "gu-IN",
378    KnIn => "kn-IN",
379    MlIn => "ml-IN",
380    MrIn => "mr-IN",
381    TaIn => "ta-IN",
382    TeIn => "te-IN",
383    NlNl => "nl-NL",
384    KoKr => "ko-KR",
385    CmnCn => "cmn-CN",
386    PlPl => "pl-PL",
387    RuRu => "ru-RU",
388    ThTh => "th-TH",
389});