///|
/// Decode a peer error without collapsing its code or data to InternalError.
pub fn MCPError::from_jsonrpc_error(value : Json) -> MCPError raise MCPError {
  let fields = wire_object(value)
  let code = match fields.get("code") {
    Some(value) => JsonInteger::from_json(value)
    None => raise InvalidRequest("Missing JSON-RPC error code")
  }
  let message = wire_string(fields, "message")
  RemoteError(
    message,
    code~,
    data=fields.get("data"),
    extensions=wire_extensions(fields, ["code", "message", "data"]),
  )
}

///|
pub fn MCPError::to_jsonrpc_error(self : MCPError) -> Json {
  let fields = match self {
    RemoteError(_, extensions~, ..) =>
      wire_extensions(extensions, ["code", "message", "data"])
    _ => Map([])
  }
  fields.set("code", self.to_error_code().to_json())
  fields.set("message", Json::string(self.message()))
  match self.to_error_data() {
    Some(value) => fields.set("data", value)
    None => ()
  }
  Json::object(fields)
}