gveditor_core_api/
messaging.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::filesystems::{DirItemInfo, FileInfo};
6use crate::state::StateData;
7use crate::{Errors, LanguageServer};
8
9/// Messages bidirectionally with the core
10#[derive(Serialize, Deserialize, Debug, Clone)]
11#[serde(tag = "msg_type")]
12pub enum Messages {
13    // When a frontend listens for changes in a particular state
14    // The core will sent the current state for it's particular ID if there is anyone
15    // If not, a default state will be sent
16    ListenToState {
17        // The message author, Core | Client
18        trigger: String,
19        // The state ID
20        state_id: u8,
21    },
22    StateUpdated {
23        state_data: StateData,
24    },
25    ShowPopup {
26        state_id: u8,
27        popup_id: String,
28        content: String,
29        title: String,
30    },
31    ShowStatusBarItem {
32        state_id: u8,
33        statusbar_item_id: String,
34        label: String,
35    },
36    HideStatusBarItem {
37        state_id: u8,
38        statusbar_item_id: String,
39    },
40    RegisterLanguageServers {
41        state_id: u8,
42        languages: HashMap<String, LanguageServer>,
43        extension_id: String,
44    },
45    NotifyLanguageServersClient {
46        state_id: u8,
47        content: String,
48    },
49    NotifyLanguageServers {
50        state_id: u8,
51        message: LanguageServerMessage,
52    },
53}
54
55impl Messages {
56    pub fn get_state_id(&self) -> u8 {
57        match self {
58            Self::ListenToState { state_id, .. } => *state_id,
59            Self::StateUpdated { state_data } => state_data.id,
60            Self::ShowPopup { state_id, .. } => *state_id,
61            Self::ShowStatusBarItem { state_id, .. } => *state_id,
62            Self::HideStatusBarItem { state_id, .. } => *state_id,
63            Self::RegisterLanguageServers { state_id, .. } => *state_id,
64            Self::NotifyLanguageServersClient { state_id, .. } => *state_id,
65            Self::NotifyLanguageServers { state_id, .. } => *state_id,
66        }
67    }
68}
69
70/// Messages use to notify the language server of certain events
71#[derive(Serialize, Deserialize, Debug, Clone)]
72#[serde(tag = "msg_type")]
73pub enum LanguageServerMessage {
74    Initialization { id: String },
75    Notification { id: String, content: String },
76}
77
78/// Messages use to notify the extensions of certain events
79#[derive(Serialize, Deserialize, Debug, Clone)]
80pub enum ExtensionMessages {
81    // TODO(marc2332): Don't use tuples
82    CoreMessage(Messages),
83    ReadFile(u8, String, Result<FileInfo, Errors>),
84    WriteFile(u8, String, String, Result<(), Errors>),
85    ListDir(u8, String, String, Result<Vec<DirItemInfo>, Errors>),
86    Unload(u8),
87}
88
89impl ExtensionMessages {
90    pub fn get_state_id(&self) -> u8 {
91        match self {
92            Self::CoreMessage(msg) => msg.get_state_id(),
93            Self::ReadFile(state_id, ..) => *state_id,
94            Self::WriteFile(state_id, ..) => *state_id,
95            Self::ListDir(state_id, ..) => *state_id,
96            Self::Unload(state_id, ..) => *state_id,
97        }
98    }
99
100    pub fn get_name(&self) -> &str {
101        match self {
102            Self::CoreMessage(..) => "core",
103            Self::ReadFile(..) => "readFile",
104            Self::WriteFile(..) => "writeFile",
105            Self::ListDir(..) => "listDir",
106            Self::Unload(..) => "unload",
107        }
108    }
109}