batch_mode_batch_schema/
finish_reason.rs

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