thrift/compiler/generate/templates/rust/lib/errors.mustache (170 lines of code) (raw):
{{!
Copyright (c) Facebook, Inc. and its affiliates.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
}}
{{#service:interactions}}{{>lib/errors}}
{{/service:interactions}}
/// Errors for {{service:name}} functions.
pub mod {{service:snake}} {
{{#service:rust_exceptions}}
pub trait As{{#rust_exception:type}}{{type:rust_name}}{{/rust_exception:type}} {
fn as_{{#rust_exception:type}}{{type:rust_name_snake}}{{/rust_exception:type}}(&self) -> Option<&{{#rust_exception:type}}{{>lib/type}}{{/rust_exception:type}}>;
}
impl As{{#rust_exception:type}}{{type:rust_name}}{{/rust_exception:type}} for ::anyhow::Error {
fn as_{{#rust_exception:type}}{{type:rust_name_snake}}{{/rust_exception:type}}(&self) -> Option<&{{#rust_exception:type}}{{>lib/type}}{{/rust_exception:type}}> {
for cause in self.chain() {
{{#rust_exception:functions}}
{{#rust_exception_function:function}}
if let Some({{function:upcamel}}Error::{{#rust_exception_function:field}}{{field:rust_name}}{{/rust_exception_function:field}}(e)) = cause.downcast_ref::<{{function:upcamel}}Error>() {
return Some(e);
}
{{/rust_exception_function:function}}
{{/rust_exception:functions}}
}
None
}
}
{{/service:rust_exceptions}}
{{#service:rustFunctions}}
{{^function:starts_interaction?}}
{{#function:exceptions?}}
/// Errors for {{function:rust_name}} (client side).
#[derive(Debug, ::thiserror::Error)]
pub enum {{function:upcamel}}Error {
{{#function:exceptions}}
#[error("{{service:name}}::{{function:rust_name}} failed with {0:?}")]
{{field:rust_name}}({{#field:type}}{{>lib/type}}{{/field:type}}),
{{/function:exceptions}}
#[error("Application exception: {0:?}")]
ApplicationException(::fbthrift::types::ApplicationException),
#[error("{0}")]
ThriftError(::anyhow::Error),
}
{{#function:uniqueExceptions}}
impl ::std::convert::From<{{#field:type}}{{>lib/type}}{{/field:type}}> for {{function:upcamel}}Error {
fn from(e: {{#field:type}}{{>lib/type}}{{/field:type}}) -> Self {
{{function:upcamel}}Error::{{field:rust_name}}(e)
}
}
impl As{{#field:type}}{{type:rust_name}}{{/field:type}} for {{function:upcamel}}Error {
fn as_{{#field:type}}{{type:rust_name_snake}}{{/field:type}}(&self) -> Option<&{{#field:type}}{{>lib/type}}{{/field:type}}> {
match self {
{{function:upcamel}}Error::{{field:rust_name}}(inner) => Some(inner),
_ => None,
}
}
}
{{/function:uniqueExceptions}}
impl ::std::convert::From<::anyhow::Error> for {{function:upcamel}}Error {
fn from(err: ::anyhow::Error) -> Self {
{{function:upcamel}}Error::ThriftError(err)
}
}
impl ::std::convert::From<::fbthrift::ApplicationException> for {{function:upcamel}}Error {
fn from(ae: ::fbthrift::ApplicationException) -> Self {
{{function:upcamel}}Error::ApplicationException(ae)
}
}
{{/function:exceptions?}}
{{^function:exceptions?}}
pub type {{function:upcamel}}Error = ::fbthrift::NonthrowingFunctionError;
{{/function:exceptions?}}
{{^function:returns_stream?}}
impl ::std::convert::From<{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn> for
::std::result::Result<{{#function:return_type}}{{>lib/type}}{{/function:return_type}}, {{function:upcamel}}Error>
{
fn from(e: {{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn) -> Self {
match e {
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn::Success(res) =>
::std::result::Result::Ok(res),
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn::ApplicationException(aexn) =>
::std::result::Result::Err({{function:upcamel}}Error::ApplicationException(aexn)),
{{#function:exceptions}}
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn::{{field:rust_name}}(exn) =>
::std::result::Result::Err({{function:upcamel}}Error::{{field:rust_name}}(exn)),
{{/function:exceptions}}
}
}
}
{{/function:returns_stream?}}{{!
}}{{#function:returns_stream?}}{{!
}}{{#function:stream_has_first_response?}}
impl ::std::convert::From<{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn> for
::std::result::Result<{{>lib/function_stream_first_response_type}}, {{function:upcamel}}Error>
{
fn from(e: {{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn) -> Self {
match e {
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn::Success(res) =>
::std::result::Result::Ok(res),
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn::ApplicationException(aexn) =>
::std::result::Result::Err({{function:upcamel}}Error::ApplicationException(aexn)),
{{#function:exceptions}}
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}Exn::{{field:rust_name}}(exn) =>
::std::result::Result::Err({{function:upcamel}}Error::{{field:rust_name}}(exn)),
{{/function:exceptions}}
}
}
}
{{/function:stream_has_first_response?}}{{!
}}{{#function:stream_exceptions?}}
#[derive(Debug, ::thiserror::Error)]
pub enum {{function:upcamel}}StreamError {
{{#function:stream_exceptions}}
#[error("{{service:name}}::{{function:rust_name}} stream failed with {0:?}")]
{{field:rust_name}}({{#field:type}}{{>lib/type}}{{/field:type}}),
{{/function:stream_exceptions}}
#[error("Application exception: {0:?}")]
ApplicationException(::fbthrift::types::ApplicationException),
#[error("{0}")]
ThriftError(::anyhow::Error),
}
{{#function:uniqueStreamExceptions}}
impl ::std::convert::From<{{#field:type}}{{>lib/type}}{{/field:type}}> for {{function:upcamel}}StreamError {
fn from(e: {{#field:type}}{{>lib/type}}{{/field:type}}) -> Self {
{{function:upcamel}}StreamError::{{field:rust_name}}(e)
}
}
{{/function:uniqueStreamExceptions}}
impl ::std::convert::From<::anyhow::Error> for {{function:upcamel}}StreamError {
fn from(err: ::anyhow::Error) -> Self {
{{function:upcamel}}StreamError::ThriftError(err)
}
}
impl ::std::convert::From<::fbthrift::ApplicationException> for {{function:upcamel}}StreamError {
fn from(ae: ::fbthrift::ApplicationException) -> Self {
{{function:upcamel}}StreamError::ApplicationException(ae)
}
}
{{/function:stream_exceptions?}}
{{^function:stream_exceptions?}}
pub type {{function:upcamel}}StreamError = ::fbthrift::NonthrowingFunctionError;
{{/function:stream_exceptions?}}
impl ::std::convert::From<{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}StreamExn> for
::std::result::Result<{{>lib/function_stream_elem_type}}, {{function:upcamel}}StreamError>
{
fn from(e: {{program:crate}}::services::{{service:snake}}::{{function:upcamel}}StreamExn) -> Self {
match e {
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}StreamExn::Success(res) =>
::std::result::Result::Ok(res),
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}StreamExn::ApplicationException(aexn) =>
::std::result::Result::Err({{function:upcamel}}StreamError::ApplicationException(aexn)),
{{#function:stream_exceptions}}
{{program:crate}}::services::{{service:snake}}::{{function:upcamel}}StreamExn::{{field:rust_name}}(exn) =>
::std::result::Result::Err({{function:upcamel}}StreamError::{{field:rust_name}}(exn)),
{{/function:stream_exceptions}}
}
}
}
{{/function:returns_stream?}}
{{/function:starts_interaction?}}
{{/service:rustFunctions}}
}
{{!newline}}