zerolaunch_plugin_protocol/
error.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, thiserror::Error)]
4pub enum ProtocolError {
5 #[error("io: {0}")]
6 Io(#[from] std::io::Error),
7
8 #[error("serde: {0}")]
9 Serde(#[from] serde_json::Error),
10
11 #[error("toml: {0}")]
12 Toml(#[from] toml::de::Error),
13
14 #[error("semver: {0}")]
15 Semver(#[from] semver::Error),
16
17 #[error("invalid frame: {0}")]
18 InvalidFrame(String),
19
20 #[error("rpc error: code={code} message={message}")]
21 Rpc { code: i32, message: String },
22
23 #[error("timeout")]
24 Timeout,
25
26 #[error("transport closed")]
27 TransportClosed,
28
29 #[error("protocol version incompatible: plugin {plugin} declares {got}, host expects {expected} (major version must match)")]
30 ProtocolVersionIncompatible {
31 plugin: String,
32 expected: String,
33 got: String,
34 },
35
36 #[error("manifest error: {0}")]
37 Manifest(String),
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct JsonRpcError {
42 pub code: i32,
43 pub message: String,
44 #[serde(default)]
45 pub data: Option<serde_json::Value>,
46}
47
48impl JsonRpcError {
49 pub fn new(code: i32, message: impl Into<String>) -> Self {
50 Self {
51 code,
52 message: message.into(),
53 data: None,
54 }
55 }
56
57 pub fn with_data(mut self, data: serde_json::Value) -> Self {
58 self.data = Some(data);
59 self
60 }
61}
62
63pub mod codes {
65 pub const PARSE_ERROR: i32 = -32700;
67 pub const INVALID_REQUEST: i32 = -32600;
69 pub const METHOD_NOT_FOUND: i32 = -32601;
71 pub const INVALID_PARAMS: i32 = -32602;
73 pub const INTERNAL_ERROR: i32 = -32603;
75 pub const PLUGIN_ERROR: i32 = -32000;
77 pub const PLUGIN_CRASHED: i32 = -32001;
79 pub const TIMEOUT_ERROR: i32 = -32002;
81 pub const UNSUPPORTED_COMPONENT: i32 = -32003;
83 pub const MODEL_NOT_FOUND: i32 = -32100;
85 pub const MODEL_PROVIDER_UNAVAILABLE: i32 = -32101;
87 pub const MODEL_INVALID_REQUEST: i32 = -32102;
89 pub const MODEL_NOT_SUPPORTED: i32 = -32103;
91 pub const MODEL_TRANSPORT: i32 = -32104;
93}