Skip to content

Instantly share code, notes, and snippets.

@Lupus
Created January 5, 2018 07:18
Show Gist options
  • Save Lupus/ea5cd71401412e567e0708e8b80fa0a6 to your computer and use it in GitHub Desktop.
Save Lupus/ea5cd71401412e567e0708e8b80fa0a6 to your computer and use it in GitHub Desktop.
module Errors: {
type t;
type baseError = {
name: string,
info: string,
message: string
};
type noHostAvailableError = {
name: string,
info: string,
message: string,
innerErrors: list((string, string))
};
type responseError = {
name: string,
info: string,
message: string,
code: int
};
exception NoHostAvailableError(noHostAvailableError);
exception ResponseError(responseError);
exception DriverInternalError(baseError);
exception AuthenticationError(baseError);
exception ArgumentError(baseError);
exception OperationTimedOutError(baseError);
exception NotSupportedError(baseError);
exception UnknownError(unit);
exception NilResultSetError(unit);
exception InvalidJSError(string);
type jse = {
.
"name": string,
"info": string,
"message": string,
"innerErrors": Js.Nullable.t(Js.Dict.t(jse)),
"code": Js.Nullable.t(int)
};
let fromJSError: jse => exn;
} = {
type t;
type errors = {
.
"_NoHostAvailableError": t,
"_ResponseError": t,
"_DriverInternalError": t,
"_AuthenticationError": t,
"_ArgumentError": t,
"_OperationTimedOutError": t,
"_NotSupportedError": t
};
[@bs.module "cassandra-driver"] external errors : errors = "";
let errNoHostAvailableError = errors##_NoHostAvailableError;
let errResponseError = errors##_ResponseError;
let errDriverInternalError = errors##_DriverInternalError;
let errAuthenticationError = errors##_AuthenticationError;
let errArgumentError = errors##_ArgumentError;
let errOperationTimedOutError = errors##_OperationTimedOutError;
let errNotSupportedError = errors##_NotSupportedError;
[@bs.deriving jsConverter]
type baseError = {
name: string,
info: string,
message: string
};
[@bs.deriving jsConverter]
type noHostAvailableError = {
name: string,
info: string,
message: string,
innerErrors: list((string, string))
};
[@bs.deriving jsConverter]
type responseError = {
name: string,
info: string,
message: string,
code: int
};
exception NoHostAvailableError(noHostAvailableError);
exception ResponseError(responseError);
exception DriverInternalError(baseError);
exception AuthenticationError(baseError);
exception ArgumentError(baseError);
exception OperationTimedOutError(baseError);
exception NotSupportedError(baseError);
exception UnknownError(unit);
exception NilResultSetError(unit);
exception InvalidJSError(string);
[%%bs.raw
{|
function isErrorOfClass(obj, errClass) {
return (obj instanceof errClass);
}
|}
];
[@bs.val] external isErrorOfClass : ('a, t) => bool = "";
type jse = {
.
"name": string,
"info": string,
"message": string,
"innerErrors": Js.Nullable.t(Js.Dict.t(jse)),
"code": Js.Nullable.t(int)
};
let fromJSError = (e: jse) =>
if (isErrorOfClass(e, errNoHostAvailableError)) {
switch (Js.toOption(e##innerErrors)) {
| Some(innerErrors) =>
Js.log(innerErrors);
NoHostAvailableError({
name: e##name,
info: e##info,
message: e##message,
innerErrors:
Js.Dict.entries(innerErrors)
|> Js.Array.map(((k, v)) => (k, v##message))
|> Array.to_list
});
| None =>
raise(
InvalidJSError(
"`innerErrors` is not present in NoHostAvailableError"
)
)
};
} else if (isErrorOfClass(e, errResponseError)) {
switch (Js.toOption(e##code)) {
| Some(code) =>
ResponseError({
name: e##name,
info: e##info,
message: e##message,
code
})
| None => raise(InvalidJSError("`code` is not present in ResponseError"))
};
} else if (isErrorOfClass(e, errDriverInternalError)) {
DriverInternalError(baseErrorFromJs(e));
} else if (isErrorOfClass(e, errAuthenticationError)) {
AuthenticationError(baseErrorFromJs(e));
} else if (isErrorOfClass(e, errArgumentError)) {
ArgumentError(baseErrorFromJs(e));
} else if (isErrorOfClass(e, errOperationTimedOutError)) {
OperationTimedOutError(baseErrorFromJs(e));
} else if (isErrorOfClass(e, errNotSupportedError)) {
NotSupportedError(baseErrorFromJs(e));
} else {
UnknownError();
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment