forked from
atscan.net/plcbundle-rs
High-performance implementation of plcbundle written in Rust
1// Debug handlers
2
3use crate::server::ServerState;
4use crate::server::error::not_found;
5use axum::{
6 extract::State,
7 http::{HeaderMap, HeaderValue, StatusCode},
8 response::IntoResponse,
9};
10use serde_json::json;
11use std::sync::Arc;
12
13pub async fn handle_debug_memory(State(state): State<ServerState>) -> impl IntoResponse {
14 // Get DID index stats for memory info (avoid holding lock in async context)
15 let did_stats = tokio::task::spawn_blocking({
16 let manager = Arc::clone(&state.manager);
17 move || manager.get_did_index_stats()
18 })
19 .await
20 .unwrap_or_default();
21
22 let cached_shards = did_stats
23 .get("cached_shards")
24 .and_then(|v| v.as_i64())
25 .unwrap_or(0);
26 let cache_limit = did_stats
27 .get("cache_limit")
28 .and_then(|v| v.as_i64())
29 .unwrap_or(0);
30
31 let response = format!(
32 "Memory Stats:\n (Not fully implemented - using sysinfo would require additional dependency)\n\nDID Index:\n Cached shards: {}/{}\n",
33 cached_shards, cache_limit
34 );
35 let mut headers = HeaderMap::new();
36 headers.insert("Content-Type", HeaderValue::from_static("text/plain"));
37 (StatusCode::OK, headers, response)
38}
39
40pub async fn handle_debug_didindex(State(state): State<ServerState>) -> impl IntoResponse {
41 // Avoid holding lock in async context
42 let stats = tokio::task::spawn_blocking({
43 let manager = Arc::clone(&state.manager);
44 move || manager.get_did_index_stats()
45 })
46 .await
47 .unwrap_or_default();
48 (StatusCode::OK, axum::Json(json!(stats))).into_response()
49}
50
51pub async fn handle_debug_resolver(State(state): State<ServerState>) -> impl IntoResponse {
52 if !state.config.enable_resolver {
53 return not_found("Resolver not enabled").into_response();
54 }
55
56 let resolver_stats = state.manager.get_resolver_stats();
57 (StatusCode::OK, axum::Json(json!(resolver_stats))).into_response()
58}