1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use crate::{ErrorCode, Message, RequestId};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Response {
pub id: RequestId,
#[serde(skip_serializing_if = "Option::is_none")]
pub result: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<ResponseError>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ResponseError {
pub code: i32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
impl Response {
pub fn ok<R: Serialize>(id: RequestId, result: R) -> Response {
Response {
id,
result: Some(serde_json::to_value(result).unwrap()),
error: None,
}
}
pub fn err(id: RequestId, code: i32, message: String) -> Response {
let error = ResponseError {
code,
message,
data: None,
};
Response {
id,
result: None,
error: Some(error),
}
}
pub fn parse_error(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::ParseError as i32 as i32, message)
}
pub fn server_not_initialized(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::ServerNotInitialized as i32, message)
}
pub fn invalid_request(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::InvalidRequest as i32 as i32, message)
}
pub fn method_not_found(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::MethodNotFound as i32 as i32, message)
}
pub fn invalid_params(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::InvalidParams as i32 as i32, message)
}
pub fn internal_error(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::InternalError as i32 as i32, message)
}
pub fn server_error_start(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::ServerErrorStart as i32 as i32, message)
}
pub fn server_error_end(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::ServerErrorEnd as i32 as i32, message)
}
pub fn request_canceled(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::RequestCanceled as i32 as i32, message)
}
pub fn content_modified(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::ContentModified as i32 as i32, message)
}
pub fn server_canceled(id: RequestId, message: String) -> Response {
Self::err(id, ErrorCode::ServerCancelled as i32 as i32, message)
}
}
impl From<Response> for Message {
fn from(response: Response) -> Message {
Message::Response(response)
}
}
impl From<(RequestId, String)> for Message {
fn from(v: (RequestId, String)) -> Message {
Message::Response(Response::ok(v.0, v.1))
}
}
macro_rules! convertible {
($type:path) => {
impl From<(RequestId, $type)> for Message {
fn from(v: (RequestId, $type)) -> Message {
Message::Response(Response::ok(v.0, v.1))
}
}
};
}
convertible!(bsp_types::InitializeBuildResult);
convertible!(bsp_types::WorkspaceBuildTargetsResult);
convertible!(serde_json::Value);
convertible!(bsp_types::DebugSessionStartResult);
convertible!(bsp_types::BuildTargetSourcesResult);
convertible!(bsp_types::BuildTargetTestResult);
convertible!(bsp_types::BuildTargetRunResult);
convertible!(bsp_types::BuildTargetCompileResult);
convertible!(bsp_types::BuildTargetResourcesResult);
convertible!(bsp_types::BuildTargetDependencyModulesResult);
convertible!(bsp_types::BuildTargetCleanCacheResult);
convertible!(bsp_types::BuildTargetInverseSourcesResult);
convertible!(bsp_types::BuildTargetDependencySourcesResult);