Skip to main content

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