thrift/compiler/generate/templates/rust/lib/service.mustache (542 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/service}}
{{/service:interactions}}
pub mod {{service:snake}} {{>lib/block}}{{!
}}{{#service:docs?}}
#![doc = {{service:docs}}]
{{/service:docs?}}{{!
}}{{#service:rustFunctions}}{{^function:starts_interaction?}}{{#function:returns_stream?}}
#[derive(Clone, Debug)]
pub enum {{function:upcamel}}StreamExn {
Success({{#function:return_type}}{{#type:stream_elem_type}}{{>lib/type}}{{/type:stream_elem_type}}{{/function:return_type}}),{{!
}}{{#function:stream_exceptions}}
{{field:rust_name}}({{#field:type}}{{>lib/type}}{{/field:type}}),{{!
}}{{/function:stream_exceptions}}
ApplicationException(::fbthrift::ApplicationException),
}{{!
}}{{#function:uniqueStreamExceptions}}
impl ::fbthrift::ExceptionInfo for {{function:upcamel}}StreamExn {
fn exn_name(&self) -> &'static str {
match self {
{{function:upcamel}}StreamExn::Success(_) => panic!("ExceptionInfo::exn_name called on Success"),
{{function:upcamel}}StreamExn::ApplicationException(aexn) => aexn.exn_name(),
{{#function:stream_exceptions}}
{{function:upcamel}}StreamExn::{{field:rust_name}}(exn) => exn.exn_name(),
{{/function:stream_exceptions}}
}
}
fn exn_value(&self) -> String {
match self {
{{function:upcamel}}StreamExn::Success(_) => panic!("ExceptionInfo::exn_value called on Success"),
{{function:upcamel}}StreamExn::ApplicationException(aexn) => aexn.exn_value(),
{{#function:stream_exceptions}}
{{function:upcamel}}StreamExn::{{field:rust_name}}(exn) => exn.exn_value(),
{{/function:stream_exceptions}}
}
}
fn exn_is_declared(&self) -> bool {
match self {
{{function:upcamel}}StreamExn::Success(_) => panic!("ExceptionInfo::exn_is_declared called on Success"),
{{function:upcamel}}StreamExn::ApplicationException(aexn) => aexn.exn_is_declared(),
{{#function:stream_exceptions}}
{{function:upcamel}}StreamExn::{{field:rust_name}}(exn) => exn.exn_is_declared(),
{{/function:stream_exceptions}}
}
}
}
impl ::fbthrift::ResultInfo for {{function:upcamel}}StreamExn {
fn result_type(&self) -> ::fbthrift::ResultType {
match self {
{{function:upcamel}}StreamExn::Success(_) => ::fbthrift::ResultType::Return,
{{function:upcamel}}StreamExn::ApplicationException(_aexn) => ::fbthrift::ResultType::Exception,
{{#function:exceptions}}
{{function:upcamel}}StreamExn::{{field:rust_name}}(_exn) => fbthrift::ResultType::Error,
{{/function:exceptions}}
}
}
}
impl ::std::convert::From<{{#field:type}}{{>lib/type}}{{/field:type}}> for {{function:upcamel}}StreamExn {
fn from(exn: {{#field:type}}{{>lib/type}}{{/field:type}}) -> Self {
{{function:upcamel}}StreamExn::{{field:rust_name}}(exn)
}
}{{!
}}{{/function:uniqueStreamExceptions}}
impl ::std::convert::From<::fbthrift::ApplicationException> for {{function:upcamel}}StreamExn {
fn from(exn: ::fbthrift::ApplicationException) -> Self {
{{function:upcamel}}StreamExn::ApplicationException(exn)
}
}
impl ::fbthrift::GetTType for {{function:upcamel}}StreamExn {
const TTYPE: ::fbthrift::TType = ::fbthrift::TType::Struct;
}
impl<P> ::fbthrift::Serialize<P> for {{function:upcamel}}StreamExn
where
P: ::fbthrift::ProtocolWriter,
{
fn write(&self, p: &mut P) {
p.write_struct_begin("{{function:upcamel}}");
match self {
{{function:upcamel}}StreamExn::Success(inner) => {
p.write_field_begin(
"Success",
{{#function:return_type}}{{>lib/ttype}}{{/function:return_type}},
0i16,
);
inner.write(p);
p.write_field_end();
}{{!
}}{{#function:stream_exceptions}}
{{function:upcamel}}StreamExn::{{field:rust_name}}(inner) => {
p.write_field_begin(
"{{field:name}}",
{{#field:type}}{{>lib/ttype}}{{/field:type}},
{{field:key}},
);
inner.write(p);
p.write_field_end();
}{{!
}}{{/function:stream_exceptions}}
{{function:upcamel}}StreamExn::ApplicationException(_) => panic!(
"Bad union Alt field {} id {}",
"ApplicationException",
-2147483648i32,
),
}
p.write_field_stop();
p.write_struct_end();
}
}
impl<P> ::fbthrift::Deserialize<P> for {{function:upcamel}}StreamExn
where
P: ::fbthrift::ProtocolReader,
{
fn read(p: &mut P) -> ::anyhow::Result<Self> {
static RETURNS: &[::fbthrift::Field] = &[
{{#function:returns_by_name}}
::fbthrift::Field::new("{{field:name}}", {{#field:type}}{{>lib/ttype}}{{/field:type}}, {{field:key}}),
{{/function:returns_by_name}}
];
let _ = p.read_struct_begin(|_| ())?;
let mut once = false;
let mut alt = {{!
}}{{#function:void?}}{{!
}}{{function:upcamel}}StreamExn::Success(()){{!
}}{{/function:void?}}{{!
}}{{^function:void?}}::std::option::Option::None{{/function:void?}}{{!
}};
loop {
let (_, fty, fid) = p.read_field_begin(|_| (), RETURNS)?;
match ((fty, fid as ::std::primitive::i32), once) {
((::fbthrift::TType::Stop, _), _) => {
p.read_field_end()?;
break;
}
(({{#function:return_type}}{{#type:stream_elem_type}}{{>lib/ttype}}{{/type:stream_elem_type}}{{/function:return_type}}, 0i32), false) => {
once = true;
alt = {{!
}}{{^function:void?}}::std::option::Option::Some({{/function:void?}}{{!
}}{{function:upcamel}}StreamExn::Success(::fbthrift::Deserialize::read(p)?){{!
}}{{^function:void?}}){{/function:void?}}{{!
}};
}{{!
}}{{#function:stream_exceptions}}
(({{#field:type}}{{>lib/ttype}}{{/field:type}}, {{field:key}}), false) => {
once = true;
alt = {{!
}}{{^function:void?}}::std::option::Option::Some({{/function:void?}}{{!
}}{{function:upcamel}}StreamExn::{{field:rust_name}}(::fbthrift::Deserialize::read(p)?){{!
}}{{^function:void?}}){{/function:void?}}{{!
}};
}{{!
}}{{/function:stream_exceptions}}
((ty, _id), false) => p.skip(ty)?,
((badty, badid), true) => return ::std::result::Result::Err(::std::convert::From::from(
::fbthrift::ApplicationException::new(
::fbthrift::ApplicationExceptionErrorCode::ProtocolError,
format!(
"unwanted extra union {} field ty {:?} id {}",
"{{function:upcamel}}StreamExn",
badty,
badid,
),
)
)),
}
p.read_field_end()?;
}
p.read_struct_end()?;{{!
}}{{#function:void?}}
::std::result::Result::Ok(alt){{!
}}{{/function:void?}}{{!
}}{{^function:void?}}
alt.ok_or_else(||
::fbthrift::ApplicationException::new(
::fbthrift::ApplicationExceptionErrorCode::MissingResult,
format!("Empty union {}", "{{function:upcamel}}StreamExn"),
)
.into(),
){{!
}}{{/function:void?}}
}
}
{{#function:stream_has_first_response?}}
#[derive(Clone, Debug)]
pub enum {{function:upcamel}}Exn {
Success({{#function:return_type}}{{#type:stream_first_response_type}}{{>lib/type}}{{/type:stream_first_response_type}}{{/function:return_type}}),{{!
}}{{#function:exceptions}}
{{field:rust_name}}({{#field:type}}{{>lib/type}}{{/field:type}}),{{!
}}{{/function:exceptions}}
ApplicationException(::fbthrift::ApplicationException),
}{{!
}}{{#function:uniqueExceptions}}
impl ::fbthrift::ExceptionInfo for {{function:upcamel}}Exn {
fn exn_name(&self) -> &'static str {
match self {
{{function:upcamel}}Exn::Success(_) => panic!("ExceptionInfo::exn_name called on Success"),
{{function:upcamel}}Exn::ApplicationException(aexn) => aexn.exn_name(),
{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(exn) => exn.exn_name(),
{{/function:exceptions}}
}
}
fn exn_value(&self) -> String {
match self {
{{function:upcamel}}Exn::Success(_) => panic!("ExceptionInfo::exn_value called on Success"),
{{function:upcamel}}Exn::ApplicationException(aexn) => aexn.exn_value(),
{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(exn) => exn.exn_value(),
{{/function:exceptions}}
}
}
fn exn_is_declared(&self) -> bool {
match self {
{{function:upcamel}}Exn::Success(_) => panic!("ExceptionInfo::exn_is_declared called on Success"),
{{function:upcamel}}Exn::ApplicationException(aexn) => aexn.exn_is_declared(),
{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(exn) => exn.exn_is_declared(),
{{/function:exceptions}}
}
}
}
impl ::fbthrift::ResultInfo for {{function:upcamel}}Exn {
fn result_type(&self) -> ::fbthrift::ResultType {
match self {
{{function:upcamel}}Exn::Success(_) => ::fbthrift::ResultType::Return,
{{function:upcamel}}Exn::ApplicationException(_aexn) => ::fbthrift::ResultType::Exception,
{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(_exn) => fbthrift::ResultType::Error,
{{/function:exceptions}}
}
}
}
impl ::std::convert::From<{{#field:type}}{{>lib/type}}{{/field:type}}> for {{function:upcamel}}Exn {
fn from(exn: {{#field:type}}{{>lib/type}}{{/field:type}}) -> Self {
{{function:upcamel}}Exn::{{field:rust_name}}(exn)
}
}{{!
}}{{/function:uniqueExceptions}}
impl ::std::convert::From<::fbthrift::ApplicationException> for {{function:upcamel}}Exn {
fn from(exn: ::fbthrift::ApplicationException) -> Self {
{{function:upcamel}}Exn::ApplicationException(exn)
}
}
impl ::fbthrift::GetTType for {{function:upcamel}}Exn {
const TTYPE: ::fbthrift::TType = ::fbthrift::TType::Struct;
}
impl<P> ::fbthrift::Serialize<P> for {{function:upcamel}}Exn
where
P: ::fbthrift::ProtocolWriter,
{
fn write(&self, p: &mut P) {
p.write_struct_begin("{{function:upcamel}}");
match self {
{{function:upcamel}}Exn::Success(inner) => {
p.write_field_begin(
"Success",
{{#function:return_type}}{{#type:stream_first_response_type}}{{>lib/ttype}}{{/type:stream_first_response_type}}{{/function:return_type}},
0i16,
);
inner.write(p);
p.write_field_end();
}{{!
}}{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(inner) => {
p.write_field_begin(
"{{field:name}}",
{{#field:type}}{{>lib/ttype}}{{/field:type}},
{{field:key}},
);
inner.write(p);
p.write_field_end();
}{{!
}}{{/function:exceptions}}
{{function:upcamel}}Exn::ApplicationException(_) => panic!(
"Bad union Alt field {} id {}",
"ApplicationException",
-2147483648i32,
),
}
p.write_field_stop();
p.write_struct_end();
}
}
impl<P> ::fbthrift::Deserialize<P> for {{function:upcamel}}Exn
where
P: ::fbthrift::ProtocolReader,
{
fn read(p: &mut P) -> ::anyhow::Result<Self> {
static RETURNS: &[::fbthrift::Field] = &[
{{#function:returns_by_name}}
::fbthrift::Field::new("{{field:name}}", {{#field:type}}{{>lib/ttype}}{{/field:type}}, {{field:key}}),
{{/function:returns_by_name}}
];
let _ = p.read_struct_begin(|_| ())?;
let mut once = false;
let mut alt = {{!
}}{{#function:void?}}{{!
}}{{function:upcamel}}Exn::Success(()){{!
}}{{/function:void?}}{{!
}}{{^function:void?}}::std::option::Option::None{{/function:void?}}{{!
}};
loop {
let (_, fty, fid) = p.read_field_begin(|_| (), RETURNS)?;
match ((fty, fid as ::std::primitive::i32), once) {
((::fbthrift::TType::Stop, _), _) => {
p.read_field_end()?;
break;
}
(({{#function:return_type}}{{#type:stream_first_response_type}}{{>lib/ttype}}{{/type:stream_first_response_type}}{{/function:return_type}}, 0i32), false) => {
once = true;
alt = {{!
}}{{^function:void?}}::std::option::Option::Some({{/function:void?}}{{!
}}{{function:upcamel}}Exn::Success(::fbthrift::Deserialize::read(p)?){{!
}}{{^function:void?}}){{/function:void?}}{{!
}};
}{{!
}}{{#function:exceptions}}
(({{#field:type}}{{>lib/ttype}}{{/field:type}}, {{field:key}}), false) => {
once = true;
alt = {{!
}}{{^function:void?}}::std::option::Option::Some({{/function:void?}}{{!
}}{{function:upcamel}}Exn::{{field:rust_name}}(::fbthrift::Deserialize::read(p)?){{!
}}{{^function:void?}}){{/function:void?}}{{!
}};
}{{!
}}{{/function:exceptions}}
((ty, _id), false) => p.skip(ty)?,
((badty, badid), true) => return ::std::result::Result::Err(::std::convert::From::from(
::fbthrift::ApplicationException::new(
::fbthrift::ApplicationExceptionErrorCode::ProtocolError,
format!(
"unwanted extra union {} field ty {:?} id {}",
"{{function:upcamel}}Exn",
badty,
badid,
),
)
)),
}
p.read_field_end()?;
}
p.read_struct_end()?;{{!
}}{{#function:void?}}
::std::result::Result::Ok(alt){{!
}}{{/function:void?}}{{!
}}{{^function:void?}}
alt.ok_or_else(||
::fbthrift::ApplicationException::new(
::fbthrift::ApplicationExceptionErrorCode::MissingResult,
format!("Empty union {}", "{{function:upcamel}}Exn"),
)
.into(),
){{!
}}{{/function:void?}}
}
}
{{/function:stream_has_first_response?}}{{/function:returns_stream?}}{{^function:returns_stream?}}
#[derive(Clone, Debug)]
pub enum {{function:upcamel}}Exn {
Success({{#function:return_type}}{{>lib/type}}{{/function:return_type}}),{{!
}}{{#function:exceptions}}
{{field:rust_name}}({{#field:type}}{{>lib/type}}{{/field:type}}),{{!
}}{{/function:exceptions}}
ApplicationException(::fbthrift::ApplicationException),
}{{!
}}{{#function:uniqueExceptions}}
impl ::std::convert::From<{{#field:type}}{{>lib/type}}{{/field:type}}> for {{function:upcamel}}Exn {
fn from(exn: {{#field:type}}{{>lib/type}}{{/field:type}}) -> Self {
{{function:upcamel}}Exn::{{field:rust_name}}(exn)
}
}{{!
}}{{/function:uniqueExceptions}}
impl ::std::convert::From<::fbthrift::ApplicationException> for {{function:upcamel}}Exn {
fn from(exn: ::fbthrift::ApplicationException) -> Self {
{{function:upcamel}}Exn::ApplicationException(exn)
}
}
impl ::fbthrift::ExceptionInfo for {{function:upcamel}}Exn {
fn exn_name(&self) -> &'static str {
match self {
{{function:upcamel}}Exn::Success(_) => panic!("ExceptionInfo::exn_name called on Success"),
{{function:upcamel}}Exn::ApplicationException(aexn) => aexn.exn_name(),
{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(exn) => exn.exn_name(),
{{/function:exceptions}}
}
}
fn exn_value(&self) -> String {
match self {
{{function:upcamel}}Exn::Success(_) => panic!("ExceptionInfo::exn_value called on Success"),
{{function:upcamel}}Exn::ApplicationException(aexn) => aexn.exn_value(),
{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(exn) => exn.exn_value(),
{{/function:exceptions}}
}
}
fn exn_is_declared(&self) -> bool {
match self {
{{function:upcamel}}Exn::Success(_) => panic!("ExceptionInfo::exn_is_declared called on Success"),
{{function:upcamel}}Exn::ApplicationException(aexn) => aexn.exn_is_declared(),
{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(exn) => exn.exn_is_declared(),
{{/function:exceptions}}
}
}
}
impl ::fbthrift::ResultInfo for {{function:upcamel}}Exn {
fn result_type(&self) -> ::fbthrift::ResultType {
match self {
{{function:upcamel}}Exn::Success(_) => ::fbthrift::ResultType::Return,
{{function:upcamel}}Exn::ApplicationException(_aexn) => ::fbthrift::ResultType::Exception,
{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(_exn) => fbthrift::ResultType::Error,
{{/function:exceptions}}
}
}
}
impl ::fbthrift::GetTType for {{function:upcamel}}Exn {
const TTYPE: ::fbthrift::TType = ::fbthrift::TType::Struct;
}
impl<P> ::fbthrift::Serialize<P> for {{function:upcamel}}Exn
where
P: ::fbthrift::ProtocolWriter,
{
fn write(&self, p: &mut P) {
if let {{function:upcamel}}Exn::ApplicationException(aexn) = self {
return aexn.write(p);
}
p.write_struct_begin("{{function:upcamel}}");
match self {
{{function:upcamel}}Exn::Success(inner) => {
p.write_field_begin(
"Success",
{{#function:return_type}}{{>lib/ttype}}{{/function:return_type}},
0i16,
);
inner.write(p);
p.write_field_end();
}{{!
}}{{#function:exceptions}}
{{function:upcamel}}Exn::{{field:rust_name}}(inner) => {
p.write_field_begin(
"{{field:name}}",
{{#field:type}}{{>lib/ttype}}{{/field:type}},
{{field:key}},
);
inner.write(p);
p.write_field_end();
}{{!
}}{{/function:exceptions}}
{{function:upcamel}}Exn::ApplicationException(_aexn) => unreachable!(),
}
p.write_field_stop();
p.write_struct_end();
}
}
impl<P> ::fbthrift::Deserialize<P> for {{function:upcamel}}Exn
where
P: ::fbthrift::ProtocolReader,
{
fn read(p: &mut P) -> ::anyhow::Result<Self> {
static RETURNS: &[::fbthrift::Field] = &[
{{#function:returns_by_name}}
::fbthrift::Field::new("{{field:name}}", {{#field:type}}{{>lib/ttype}}{{/field:type}}, {{field:key}}),
{{/function:returns_by_name}}
];
let _ = p.read_struct_begin(|_| ())?;
let mut once = false;
let mut alt = {{!
}}{{#function:void?}}{{!
}}{{function:upcamel}}Exn::Success(()){{!
}}{{/function:void?}}{{!
}}{{^function:void?}}::std::option::Option::None{{/function:void?}}{{!
}};
loop {
let (_, fty, fid) = p.read_field_begin(|_| (), RETURNS)?;
match ((fty, fid as ::std::primitive::i32), once) {
((::fbthrift::TType::Stop, _), _) => {
p.read_field_end()?;
break;
}
(({{#function:return_type}}{{>lib/ttype}}{{/function:return_type}}, 0i32), false) => {
once = true;
alt = {{!
}}{{^function:void?}}::std::option::Option::Some({{/function:void?}}{{!
}}{{function:upcamel}}Exn::Success(::fbthrift::Deserialize::read(p)?){{!
}}{{^function:void?}}){{/function:void?}}{{!
}};
}{{!
}}{{#function:exceptions}}
(({{#field:type}}{{>lib/ttype}}{{/field:type}}, {{field:key}}), false) => {
once = true;
alt = {{!
}}{{^function:void?}}::std::option::Option::Some({{/function:void?}}{{!
}}{{function:upcamel}}Exn::{{field:rust_name}}(::fbthrift::Deserialize::read(p)?){{!
}}{{^function:void?}}){{/function:void?}}{{!
}};
}{{!
}}{{/function:exceptions}}
((ty, _id), false) => p.skip(ty)?,
((badty, badid), true) => return ::std::result::Result::Err(::std::convert::From::from(
::fbthrift::ApplicationException::new(
::fbthrift::ApplicationExceptionErrorCode::ProtocolError,
format!(
"unwanted extra union {} field ty {:?} id {}",
"{{function:upcamel}}Exn",
badty,
badid,
),
)
)),
}
p.read_field_end()?;
}
p.read_struct_end()?;{{!
}}{{#function:void?}}
::std::result::Result::Ok(alt){{!
}}{{/function:void?}}{{!
}}{{^function:void?}}
alt.ok_or_else(||
::fbthrift::ApplicationException::new(
::fbthrift::ApplicationExceptionErrorCode::MissingResult,
format!("Empty union {}", "{{function:upcamel}}Exn"),
)
.into(),
){{!
}}{{/function:void?}}
}
}{{!
}}{{/function:returns_stream?}}{{/function:starts_interaction?}}{{/service:rustFunctions}}
}
{{!newline}}