You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Francisco Ayala (Jira)" <ji...@apache.org> on 2022/04/15 14:47:00 UTC

[jira] [Created] (THRIFT-5559) Processor can be implemented on handler trait itself

Francisco Ayala created THRIFT-5559:
---------------------------------------

             Summary: Processor can be implemented on handler trait itself
                 Key: THRIFT-5559
                 URL: https://issues.apache.org/jira/browse/THRIFT-5559
             Project: Thrift
          Issue Type: Proposal
          Components: Rust - Compiler
            Reporter: Francisco Ayala


Right now the compiler produces code of the following form:

 
{code:java}
pub trait ServiceSyncHandler {
  fn handle_test_episode(&self, arg: types::Type1) -> thrift::Result<types::Type1>;
}
pub struct ServiceSyncProcessor<H: ServiceSyncHandler> {
  handler: H,
}
impl <H: ServiceSyncHandler> ServiceSyncProcessor<H> {
  pub fn new(handler: H) -> ServiceSyncProcessor<H> {
    ServiceSyncProcessor {
      handler,
    }
  }
  fn process_test_episode(&self, incoming_sequence_number: i32, i_prot: &mut dyn TInputProtocol, o_prot: &mut dyn TOutputProtocol) -> thrift::Result<()> {
    TServiceProcessFunctions::process_test_episode(&self.handler, incoming_sequence_number, i_prot, o_prot)
  }
} {code}
There is this object called "ServiceSyncProcessor" which wraps the actual handler. However it has no other fields, and also only ever utilizes a reference to the handler. Thus my question is why aren't the methods implemented on the type itself? Like this:

 

 
{code:java}
impl dyn ServiceSyncHandler {
    fn process_test_episode(
        &self,
        incoming_sequence_number: i32,
        i_prot: &mut dyn TInputProtocol,
        o_prot: &mut dyn TOutputProtocol,
    ) -> thrift::Result<()> {
        TServiceProcessFunctions::process_test_episode(
            self,
            incoming_sequence_number,
            i_prot,
            o_prot,
        )
    }
}{code}
In my case this is limiting since I don't want the server to take ownership of the processor object, since I'm doing everything in a single thread and need this object for other purposes. It was easy enough implementing my own server, but this is now blocking me.

 

My questions are thus: Is there a reason for this design? Would implementing the alternative I proposed be a welcome addition?

 



--
This message was sent by Atlassian Jira
(v8.20.1#820001)