Skip to main content

aster/
protocol.rs

1use serde::{Deserialize, Serialize};
2
3pub const PROTOCOL_VERSION: u32 = 7;
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
6pub struct RequestEnvelope {
7    pub version: u32,
8    #[serde(flatten)]
9    pub request: Request,
10}
11
12impl RequestEnvelope {
13    pub fn new(request: Request) -> Self {
14        Self {
15            version: PROTOCOL_VERSION,
16            request,
17        }
18    }
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
22#[serde(tag = "type", rename_all = "snake_case", deny_unknown_fields)]
23pub enum Request {
24    Ping,
25    Shutdown,
26    Record {
27        command: String,
28        cwd: String,
29        exit_code: i32,
30        observed_at_ms: i64,
31        session_id: String,
32    },
33    Complete {
34        buffer: String,
35        cursor_byte: usize,
36        cwd: String,
37        limit: Option<usize>,
38    },
39    Fuzzy {
40        query: String,
41        cwd: String,
42        limit: Option<usize>,
43    },
44    ImportHistory {
45        path: String,
46    },
47}
48
49#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
50#[serde(tag = "type", rename_all = "snake_case")]
51pub enum Response {
52    Pong { version: String },
53    Recorded,
54    ShuttingDown,
55    Completion(CompletionResponse),
56    Imported { imported: usize, skipped: bool },
57    Error { message: String },
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
61pub struct CompletionResponse {
62    pub replace_start_byte: usize,
63    pub replace_end_byte: usize,
64    pub candidates: Vec<Candidate>,
65    pub enrichment_pending: bool,
66}
67
68impl CompletionResponse {
69    pub fn empty(cursor_byte: usize) -> Self {
70        Self {
71            replace_start_byte: cursor_byte,
72            replace_end_byte: cursor_byte,
73            candidates: Vec::new(),
74            enrichment_pending: false,
75        }
76    }
77}
78
79#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
80pub struct Candidate {
81    pub display: String,
82    pub description: String,
83    pub description_pending: bool,
84    pub kind: CandidateKind,
85    pub insert_text: String,
86    pub accept_text: String,
87    pub source: CandidateSource,
88}
89
90#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
91#[serde(rename_all = "snake_case")]
92pub enum CandidateKind {
93    History,
94    Command,
95    File,
96    Directory,
97    Option,
98}
99
100#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
101#[serde(rename_all = "snake_case")]
102pub enum CandidateSource {
103    History,
104    Command,
105    Filesystem,
106    Help,
107}