batch_mode_batch_schema/
batch_token_details.rs

1// ---------------- [ File: src/batch_token_details.rs ]
2crate::ix!();
3
4#[derive(Debug,Serialize,Deserialize)]
5pub struct BatchTokenDetails {
6    cached_tokens:              Option<u32>,
7    audio_tokens:               Option<u32>,
8    reasoning_tokens:           Option<u32>,
9    accepted_prediction_tokens: Option<u32>,
10    rejected_prediction_tokens: Option<u32>,
11}
12
13impl BatchTokenDetails {
14
15    pub fn cached_tokens(&self) -> Option<u32> {
16        self.cached_tokens
17    }
18
19    pub fn audio_tokens(&self) -> Option<u32> {
20        self.audio_tokens
21    }
22
23    pub fn reasoning_tokens(&self) -> Option<u32> {
24        self.reasoning_tokens
25    }
26
27    pub fn accepted_prediction_tokens(&self) -> Option<u32> {
28        self.accepted_prediction_tokens
29    }
30
31    pub fn rejected_prediction_tokens(&self) -> Option<u32> {
32        self.rejected_prediction_tokens
33    }
34
35    /// Calculates the total tokens by summing up all available token counts.
36    pub fn total_tokens(&self) -> u32 {
37        self.cached_tokens.unwrap_or(0)
38            + self.audio_tokens.unwrap_or(0)
39            + self.reasoning_tokens.unwrap_or(0)
40            + self.accepted_prediction_tokens.unwrap_or(0)
41            + self.rejected_prediction_tokens.unwrap_or(0)
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48    use serde_json::json;
49
50    #[test]
51    fn test_batch_token_details_full() {
52        let json_data = json!({
53            "cached_tokens": 10,
54            "audio_tokens": 20,
55            "reasoning_tokens": 30,
56            "accepted_prediction_tokens": 40,
57            "rejected_prediction_tokens": 50
58        });
59
60        let token_details: BatchTokenDetails = serde_json::from_value(json_data).unwrap();
61
62        assert_eq!(token_details.cached_tokens(), Some(10));
63        assert_eq!(token_details.audio_tokens(), Some(20));
64        assert_eq!(token_details.reasoning_tokens(), Some(30));
65        assert_eq!(token_details.accepted_prediction_tokens(), Some(40));
66        assert_eq!(token_details.rejected_prediction_tokens(), Some(50));
67        assert_eq!(token_details.total_tokens(), 150);
68    }
69
70    #[test]
71    fn test_batch_token_details_partial() {
72        let json_data = json!({
73            "audio_tokens": 25,
74            "accepted_prediction_tokens": 35
75            // Other fields are missing
76        });
77
78        let token_details: BatchTokenDetails = serde_json::from_value(json_data).unwrap();
79
80        assert_eq!(token_details.cached_tokens(), None);
81        assert_eq!(token_details.audio_tokens(), Some(25));
82        assert_eq!(token_details.reasoning_tokens(), None);
83        assert_eq!(token_details.accepted_prediction_tokens(), Some(35));
84        assert_eq!(token_details.rejected_prediction_tokens(), None);
85        assert_eq!(token_details.total_tokens(), 60);
86    }
87
88    #[test]
89    fn test_batch_token_details_all_missing() {
90        let json_data = json!({});
91
92        let token_details: BatchTokenDetails = serde_json::from_value(json_data).unwrap();
93
94        assert!(token_details.cached_tokens().is_none());
95        assert!(token_details.audio_tokens().is_none());
96        assert!(token_details.reasoning_tokens().is_none());
97        assert!(token_details.accepted_prediction_tokens().is_none());
98        assert!(token_details.rejected_prediction_tokens().is_none());
99        assert_eq!(token_details.total_tokens(), 0);
100    }
101}