1use serde::{Deserialize, Serialize};
10
11pub const SCHEMA_VERSION: u32 = 3;
12
13pub const MAX_CAPTURE_BYTES: usize = 64 * 1024 * 1024;
17pub const MAX_CAPTURE_EVENTS: u64 = 100_000;
18pub const MAX_RECORD_BYTES: usize = 256 * 1024;
19pub const TERMINAL_RESERVE: usize = 1024;
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
24#[serde(rename_all = "snake_case")]
25pub enum EventKind {
26 SessionStart,
27 SessionEnd,
28 Input,
29 Paste,
30 State,
31 Document,
32 Mutation,
33 History,
34 Render,
35 Resize,
36 JobStarted,
37 JobFinished,
38 JobRejected,
39 LspMessage,
40 Replay,
41 ReplayChunk,
42 TraceEnd,
43 Error,
44 Panic,
45}
46
47#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
48pub enum ContentPolicy {
49 #[default]
51 Metadata,
52 Full,
54}
55
56#[derive(Debug, Clone, Copy, PartialEq, Eq)]
58pub struct Limits {
59 pub bytes: usize,
60 pub events: u64,
61 pub record_bytes: usize,
62}
63
64impl Default for Limits {
65 fn default() -> Self {
66 Self {
67 bytes: MAX_CAPTURE_BYTES,
68 events: MAX_CAPTURE_EVENTS,
69 record_bytes: MAX_RECORD_BYTES,
70 }
71 }
72}
73
74impl Limits {
75 pub fn valid(&self) -> bool {
77 self.bytes >= TERMINAL_RESERVE * 2
78 && self.bytes <= MAX_CAPTURE_BYTES
79 && self.events > 0
80 && self.events <= MAX_CAPTURE_EVENTS
81 && self.record_bytes > 0
82 && self.record_bytes <= MAX_RECORD_BYTES
83 }
84}
85
86#[derive(Debug, Default, Clone, Copy)]
87pub struct TraceOptions {
88 pub content: ContentPolicy,
89 pub limits: Limits,
90}
91
92pub fn preview(text: &str) -> String {
94 let mut chars = text.chars();
95 let mut result: String = chars.by_ref().take(120).collect();
96 if chars.next().is_some() {
97 result.push('…');
98 }
99 result
100}