Skip to main content

gproxy_transform/transform/common/
usage.rs

1#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
2pub struct TokenUsage {
3    pub input_tokens: Option<u64>,
4    pub output_tokens: Option<u64>,
5    pub cache_read_tokens: Option<u64>,
6    pub cache_creation_tokens: Option<u64>,
7    pub reasoning_tokens: Option<u64>,
8}
9
10impl TokenUsage {
11    pub const fn empty() -> Self {
12        Self {
13            input_tokens: None,
14            output_tokens: None,
15            cache_read_tokens: None,
16            cache_creation_tokens: None,
17            reasoning_tokens: None,
18        }
19    }
20
21    pub fn total_tokens(self) -> Option<u64> {
22        checked_sum([
23            self.input_tokens,
24            self.output_tokens,
25            self.cache_read_tokens,
26            self.cache_creation_tokens,
27        ])
28    }
29}
30
31pub fn checked_sum(values: impl IntoIterator<Item = Option<u64>>) -> Option<u64> {
32    values
33        .into_iter()
34        .flatten()
35        .try_fold(0_u64, |acc, value| acc.checked_add(value))
36}