88 lines
2.2 KiB
Python
88 lines
2.2 KiB
Python
|
from typing import List, Dict, Any, Optional
|
||
|
|
||
|
from jsonrpc.exceptions import JSONRPCDispatchException, JSONRPCInvalidParams
|
||
|
|
||
|
import dbt.exceptions
|
||
|
|
||
|
|
||
|
class RPCException(JSONRPCDispatchException):
|
||
|
def __init__(
|
||
|
self,
|
||
|
code: Optional[int] = None,
|
||
|
message: Optional[str] = None,
|
||
|
data: Optional[Dict[str, Any]] = None,
|
||
|
logs: Optional[List[Dict[str, Any]]] = None,
|
||
|
tags: Optional[Dict[str, Any]] = None
|
||
|
) -> None:
|
||
|
if code is None:
|
||
|
code = -32000
|
||
|
if message is None:
|
||
|
message = 'Server error'
|
||
|
if data is None:
|
||
|
data = {}
|
||
|
|
||
|
super().__init__(code=code, message=message, data=data)
|
||
|
if logs is not None:
|
||
|
self.logs = logs
|
||
|
self.error.data['tags'] = tags
|
||
|
|
||
|
def __str__(self):
|
||
|
return (
|
||
|
'RPCException({0.code}, {0.message}, {0.data}, {1.logs})'
|
||
|
.format(self.error, self)
|
||
|
)
|
||
|
|
||
|
@property
|
||
|
def logs(self) -> List[Dict[str, Any]]:
|
||
|
return self.error.data.get('logs')
|
||
|
|
||
|
@logs.setter
|
||
|
def logs(self, value):
|
||
|
if value is None:
|
||
|
return
|
||
|
self.error.data['logs'] = value
|
||
|
|
||
|
@property
|
||
|
def tags(self):
|
||
|
return self.error.data.get('tags')
|
||
|
|
||
|
@tags.setter
|
||
|
def tags(self, value):
|
||
|
if value is None:
|
||
|
return
|
||
|
self.error.data['tags'] = value
|
||
|
|
||
|
@classmethod
|
||
|
def from_error(cls, err):
|
||
|
return cls(
|
||
|
code=err.code,
|
||
|
message=err.message,
|
||
|
data=err.data,
|
||
|
logs=err.data.get('logs'),
|
||
|
tags=err.data.get('tags'),
|
||
|
)
|
||
|
|
||
|
|
||
|
def invalid_params(data):
|
||
|
return RPCException(
|
||
|
code=JSONRPCInvalidParams.CODE,
|
||
|
message=JSONRPCInvalidParams.MESSAGE,
|
||
|
data=data
|
||
|
)
|
||
|
|
||
|
|
||
|
def server_error(err, logs=None, tags=None):
|
||
|
exc = dbt.exceptions.Exception(str(err))
|
||
|
return dbt_error(exc, logs, tags)
|
||
|
|
||
|
|
||
|
def timeout_error(timeout_value, logs=None, tags=None):
|
||
|
exc = dbt.exceptions.RPCTimeoutException(timeout_value)
|
||
|
return dbt_error(exc, logs, tags)
|
||
|
|
||
|
|
||
|
def dbt_error(exc, logs=None, tags=None):
|
||
|
exc = RPCException(code=exc.CODE, message=exc.MESSAGE, data=exc.data(),
|
||
|
logs=logs, tags=tags)
|
||
|
return exc
|