1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Clone, PartialEq, Serialize, Deserialize)]
7#[serde(deny_unknown_fields)]
8pub struct Continuation {
9 pub format: String,
10 pub compatibility_key: String,
11 pub payload: Value,
12}
13
14impl std::fmt::Debug for Continuation {
15 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16 f.debug_struct("Continuation")
17 .field("format", &self.format)
18 .field("compatibility_key", &self.compatibility_key)
19 .finish_non_exhaustive()
20 }
21}
22
23#[cfg(test)]
24mod tests {
25 use super::*;
26 #[test]
27 fn opaque_state_roundtrips_but_is_redacted_from_debug() {
28 let c = Continuation {
29 format: "openrouter.reasoning.v1".into(),
30 compatibility_key: "model".into(),
31 payload: serde_json::json!({"reasoning_details":[{"signature":"secret-signature"}]}),
32 };
33 assert_eq!(
34 serde_json::from_slice::<Continuation>(&serde_json::to_vec(&c).unwrap()).unwrap(),
35 c
36 );
37 assert!(!format!("{c:?}").contains("secret-signature"));
38 }
39}