Skip to main content

gproxy_protocol/claude/common/blocks/
fallback.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4use super::super::{ClaudeModel, JsonObject, RefusalCategory};
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
7#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
8pub struct FallbackBlockParam {
9    pub from: FallbackInfo,
10    pub to: FallbackInfo,
11    #[serde(rename = "type")]
12    pub type_: FallbackBlockType,
13    /// `upstream_docs/claude/docs/Create a Message.md`,
14    /// `BetaFallbackBlockParam.trigger`: optional unknown; echo it verbatim,
15    /// preserving explicit null separately from absence.
16    #[serde(
17        default,
18        deserialize_with = "deserialize_present_value",
19        skip_serializing_if = "Option::is_none"
20    )]
21    pub trigger: Option<Value>,
22    #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
23    pub rest: JsonObject,
24}
25
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
27#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
28pub struct ResponseFallbackBlock {
29    pub from: FallbackInfo,
30    pub to: FallbackInfo,
31    pub trigger: FallbackRefusalTrigger,
32    #[serde(rename = "type")]
33    pub type_: FallbackBlockType,
34    #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
35    pub rest: JsonObject,
36}
37
38#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
39#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
40pub struct FallbackRefusalTrigger {
41    pub category: RefusalCategory,
42    #[serde(rename = "type")]
43    pub type_: FallbackRefusalTriggerType,
44    #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
45    pub rest: JsonObject,
46}
47
48#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
49#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
50pub struct FallbackInfo {
51    pub model: ClaudeModel,
52    #[serde(default, flatten, skip_serializing_if = "JsonObject::is_empty")]
53    pub rest: JsonObject,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
58pub enum FallbackBlockType {
59    #[serde(rename = "fallback")]
60    Fallback,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
64#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
65pub enum FallbackRefusalTriggerType {
66    #[serde(rename = "refusal")]
67    Refusal,
68}
69
70fn deserialize_present_value<'de, D>(deserializer: D) -> Result<Option<Value>, D::Error>
71where
72    D: serde::Deserializer<'de>,
73{
74    Value::deserialize(deserializer).map(Some)
75}