use serde::{Deserialize, Serialize};
pub const SCHEMA_VERSION: u32 = 2;
pub const MAX_CAPTURE_BYTES: usize = 64 * 1024 * 1024;
pub const MAX_CAPTURE_EVENTS: u64 = 100_000;
pub const MAX_RECORD_BYTES: usize = 256 * 1024;
pub const TERMINAL_RESERVE: usize = 1024;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EventKind {
SessionStart,
SessionEnd,
Input,
Paste,
State,
Document,
Mutation,
History,
Render,
Resize,
JobStarted,
JobFinished,
JobRejected,
LspMessage,
Replay,
TraceEnd,
Error,
Panic,
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum ContentPolicy {
#[default]
Metadata,
Full,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Limits {
pub bytes: usize,
pub events: u64,
pub record_bytes: usize,
}
impl Default for Limits {
fn default() -> Self {
Self {
bytes: MAX_CAPTURE_BYTES,
events: MAX_CAPTURE_EVENTS,
record_bytes: MAX_RECORD_BYTES,
}
}
}
impl Limits {
pub fn valid(&self) -> bool {
self.bytes >= TERMINAL_RESERVE * 2
&& self.bytes <= MAX_CAPTURE_BYTES
&& self.events > 0
&& self.events <= MAX_CAPTURE_EVENTS
&& self.record_bytes > 0
&& self.record_bytes <= MAX_RECORD_BYTES
}
}
#[derive(Debug, Default, Clone, Copy)]
pub struct TraceOptions {
pub content: ContentPolicy,
pub limits: Limits,
}
pub fn preview(text: &str) -> String {
let mut chars = text.chars();
let mut result: String = chars.by_ref().take(120).collect();
if chars.next().is_some() {
result.push('…');
}
result
}