use serde::{Deserialize, Serialize};
use super::types::Position;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VersionResult {
pub version: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub git_hash: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub git_commit: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub git_dirty: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub build_date: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub build_timestamp: Option<String>,
pub rust_version: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub target: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UptimeResult {
pub uptime_seconds: f64,
pub uptime_human: String,
pub start_time: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct KernelStateResult {
pub buffer_count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub active_buffer: Option<usize>,
pub buffer_ids: Vec<usize>,
pub event_handlers: usize,
pub event_queue_len: usize,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum YankType {
Characterwise,
Linewise,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegisterEntry {
pub name: String,
pub content: String,
pub content_length: usize,
pub yank_type: YankType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RegistersResult {
pub unnamed: RegisterEntry,
pub named: Vec<RegisterEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MarkEntry {
pub name: String,
pub position: Position,
#[serde(skip_serializing_if = "Option::is_none")]
pub buffer_id: Option<usize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MarksResult {
pub local: Vec<MarkEntry>,
pub global: Vec<MarkEntry>,
pub special: Vec<MarkEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModeStackResult {
pub current: String,
pub stack: Vec<String>,
pub depth: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricEntry {
pub name: String,
pub value: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetricsResult {
pub uptime_seconds: f64,
pub total_requests: u64,
pub counters: Vec<MetricEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HandlerStats {
pub method: String,
pub call_count: u64,
pub total_micros: u64,
pub avg_micros: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HandlersResult {
pub handlers: Vec<HandlerStats>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct LogLevelParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogLevelResult {
pub level: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub previous: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogTailParams {
#[serde(default = "default_log_count")]
pub count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub target: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grep: Option<String>,
}
const fn default_log_count() -> usize {
50
}
impl Default for LogTailParams {
fn default() -> Self {
Self {
count: default_log_count(),
level: None,
target: None,
grep: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogEntryResult {
pub timestamp: String,
pub level: String,
pub target: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogTailResult {
pub entries: Vec<LogEntryResult>,
pub overflow_count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct LogSubscribeParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogSubscribeResult {
pub subscription_id: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogUnsubscribeParams {
pub subscription_id: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LogUnsubscribeResult {
pub success: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotServerSection {
pub version: String,
pub uptime_seconds: f64,
pub session_id: String,
pub client_count: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotEditorSection {
pub mode: String,
pub cursor: Position,
#[serde(skip_serializing_if = "Option::is_none")]
pub selection: Option<SnapshotSelectionInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotSelectionInfo {
pub mode: String,
pub anchor: Position,
pub cursor: Position,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotBufferInfo {
pub id: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_path: Option<String>,
pub modified: bool,
pub line_count: usize,
pub preview: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotBuffersSection {
pub count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
pub active_id: Option<usize>,
pub buffers: Vec<SnapshotBufferInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotUiSection {
pub width: u16,
pub height: u16,
pub ascii_art: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnapshotVimSection {
pub registers: RegistersResult,
pub marks: MarksResult,
pub mode_stack: ModeStackResult,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VisualSnapshotResult {
pub schema_version: String,
pub timestamp: String,
pub server: SnapshotServerSection,
pub editor: SnapshotEditorSection,
pub buffers: SnapshotBuffersSection,
pub ui: SnapshotUiSection,
pub vim: SnapshotVimSection,
pub metrics: MetricsResult,
}
#[cfg(test)]
#[path = "debug_tests.rs"]
mod tests;