Skip to main content

aster/
protocol.rs

1use serde::{Deserialize, Serialize};
2
3pub const PROTOCOL_VERSION: u32 = 6;
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}
66
67impl CompletionResponse {
68    pub fn empty(cursor_byte: usize) -> Self {
69        Self {
70            replace_start_byte: cursor_byte,
71            replace_end_byte: cursor_byte,
72            candidates: Vec::new(),
73        }
74    }
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
78pub struct Candidate {
79    pub display: String,
80    pub description: String,
81    pub description_pending: bool,
82    pub kind: CandidateKind,
83    pub insert_text: String,
84    pub accept_text: String,
85    pub source: CandidateSource,
86}
87
88#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
89#[serde(rename_all = "snake_case")]
90pub enum CandidateKind {
91    History,
92    Command,
93}
94
95#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
96#[serde(rename_all = "snake_case")]
97pub enum CandidateSource {
98    History,
99    Command,
100}