Skip to main content

tuwunel_admin/query/raw/
keys_sizes.rs

1use 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}