batch_mode_batch_schema/
batch_token_details.rs

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