from __future__ import annotations
from dataclasses import dataclass
from typing import Any, Dict, Optional, Union
@dataclass
class JsonRpcRequest:
jsonrpc: str = "2.0"
id: Optional[Union[int, str]] = None
method: str = ""
params: Optional[Dict[str, Any]] = None
def to_dict(self) -> Dict[str, Any]:
result: Dict[str, Any] = {
"jsonrpc": self.jsonrpc,
"method": self.method,
}
if self.id is not None:
result["id"] = self.id
if self.params is not None:
result["params"] = self.params
return result
@dataclass
class JsonRpcError:
code: int
message: str
data: Optional[Any] = None
@classmethod
def from_dict(cls, d: Dict[str, Any]) -> JsonRpcError:
return cls(
code=d["code"],
message=d["message"],
data=d.get("data"),
)
@dataclass
class JsonRpcResponse:
jsonrpc: str
id: Optional[Union[int, str]]
result: Optional[Any] = None
error: Optional[JsonRpcError] = None
partial: Optional[bool] = None
@classmethod
def from_dict(cls, d: Dict[str, Any]) -> JsonRpcResponse:
error = None
if "error" in d:
error = JsonRpcError.from_dict(d["error"])
return cls(
jsonrpc=d["jsonrpc"],
id=d.get("id"),
result=d.get("result"),
error=error,
partial=d.get("partial"),
)
def unwrap(self) -> Any:
from ..errors.errors import error_from_code
if self.error:
raise error_from_code(self.error.code, self.error.message, self.error.data)
return self.result