batch_mode_batch_schema/
finish_reason.rs

1// ---------------- [ File: batch-mode-batch-schema/src/finish_reason.rs ]
2crate::ix!();
3
4#[derive(Default,Debug,Clone,PartialEq,Eq,Hash)]
5pub enum FinishReason {
6
7    #[default]
8    Stop,
9
10    Length,
11    ContentFilter,
12    Unknown(String),
13}
14
15impl<'de> Deserialize<'de> for FinishReason {
16    fn deserialize<D>(deserializer: D) -> Result<FinishReason, D::Error>
17    where
18        D: serde::Deserializer<'de>,
19    {
20        let opt = Option::<String>::deserialize(deserializer)?;
21        match opt.as_deref() {
22            Some("stop")           => Ok(FinishReason::Stop),
23            Some("length")         => Ok(FinishReason::Length),
24            Some("content_filter") => Ok(FinishReason::ContentFilter),
25            Some(other)            => Ok(FinishReason::Unknown(other.to_string())),
26            None                   => Ok(FinishReason::Unknown("None".to_string())),
27        }
28    }
29}
30
31impl Serialize for FinishReason {
32    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
33    where
34        S: serde::Serializer,
35    {
36        let s = match self {
37            FinishReason::Stop => "stop",
38            FinishReason::Length => "length",
39            FinishReason::ContentFilter => "content_filter",
40            FinishReason::Unknown(other) => other.as_str(),
41        };
42        serializer.serialize_some(s)
43    }
44}
45
46#[cfg(test)]
47mod finish_reason_tests {
48    use super::*;
49
50    // Test suite for FinishReason
51    #[test]
52    fn test_finish_reason_deserialization() {
53        // Known reasons
54        let reasons = vec!["stop", "length", "content_filter"];
55        let expected_reasons = vec![
56            FinishReason::Stop,
57            FinishReason::Length,
58            FinishReason::ContentFilter,
59        ];
60
61        for (reason_str, expected_reason) in reasons.iter().zip(expected_reasons.iter()) {
62            let json = format!("\"{}\"", reason_str);
63            let finish_reason: FinishReason = serde_json::from_str(&json).unwrap();
64            pretty_assert_eq!(&finish_reason, expected_reason);
65        }
66
67        // Unknown reason
68        let json = "\"unknown_reason\"";
69        let finish_reason: FinishReason = serde_json::from_str(json).unwrap();
70        pretty_assert_eq!(
71            finish_reason,
72            FinishReason::Unknown("unknown_reason".to_string())
73        );
74
75        // Null reason
76        let json = "null";
77        let finish_reason: FinishReason = serde_json::from_str(json).unwrap();
78        pretty_assert_eq!(
79            finish_reason,
80            FinishReason::Unknown("None".to_string())
81        );
82
83        // Empty string as reason
84        let json = "\"\"";
85        let finish_reason: FinishReason = serde_json::from_str(json).unwrap();
86        pretty_assert_eq!(finish_reason, FinishReason::Unknown("".to_string()));
87    }
88}