use serde::Serialize; use std::borrow::Cow; use surrealdb::sql::Value; #[derive(Serialize)] enum Content { #[serde(rename = "result")] Success(Value), #[serde(rename = "error")] Failure(Failure), } #[derive(Serialize)] pub struct Response { id: Option, #[serde(flatten)] content: Content, } impl Response { // Create a JSON RPC result response pub fn success(id: Option, val: Value) -> Response { Response { id, content: Content::Success(val), } } // Create a JSON RPC failure response pub fn failure(id: Option, err: Failure) -> Response { Response { id, content: Content::Failure(err), } } } #[derive(Clone, Debug, Serialize)] pub struct Failure { code: i64, message: Cow<'static, str>, } impl Failure { pub const PARSE_ERROR: Failure = Failure { code: -32700, message: Cow::Borrowed("Parse error"), }; pub const INVALID_REQUEST: Failure = Failure { code: -32600, message: Cow::Borrowed("Invalid Request"), }; pub const METHOD_NOT_FOUND: Failure = Failure { code: -32601, message: Cow::Borrowed("Method not found"), }; pub const INVALID_PARAMS: Failure = Failure { code: -32602, message: Cow::Borrowed("Invalid params"), }; pub const INTERNAL_ERROR: Failure = Failure { code: -32603, message: Cow::Borrowed("Internal error"), }; pub fn custom(message: S) -> Failure where Cow<'static, str>: From, { Failure { code: -32000, message: message.into(), } } }