tuwunel_admin/query/raw/
keys_sizes.rs1use std::collections::BTreeMap;
2
3use futures::StreamExt;
4use tuwunel_core::{
5 Result,
6 utils::{
7 stream::{IterStream, ReadyExt, TryIgnore},
8 string::EMPTY,
9 },
10};
11
12use super::with_map_or;
13use crate::admin_command;
14
15#[admin_command]
16pub(super) async fn raw_keys_sizes(&self, map: Option<String>, prefix: Option<String>) -> Result {
17 let prefix = prefix.as_deref().unwrap_or(EMPTY);
18
19 let maps = with_map_or(map.as_deref(), self.services)?;
20
21 let query = maps
22 .iter()
23 .stream()
24 .map(|map| map.raw_keys_prefix(&prefix))
25 .flatten()
26 .ignore_err()
27 .map(<[u8]>::len)
28 .ready_fold_default(|mut map: BTreeMap<_, usize>, len| {
29 let entry = map.entry(len).or_default();
30 *entry = entry.saturating_add(1);
31 map
32 });
33
34 self.write_timed_query(query).await
35}