This is an automated email from the ASF dual-hosted git repository.

mssun pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git


The following commit(s) were added to refs/heads/develop by this push:
     new ac50c6d  [rpc] Introduce IntoRequest trait to ease the request handling
ac50c6d is described below

commit ac50c6db301bc7ec66e6dd6585b301c8f4f7cd4b
Author: Mingshen Sun <[email protected]>
AuthorDate: Thu Feb 13 20:59:54 2020 -0800

    [rpc] Introduce IntoRequest trait to ease the request handling
---
 rpc/Cargo.toml                                     |  1 +
 rpc/proc_macro/Cargo.toml                          | 14 +++++++++++
 rpc/proc_macro/src/lib.rs                          | 29 ++++++++++++++++++++++
 rpc/src/lib.rs                                     |  3 ++-
 rpc/src/request.rs                                 |  4 +++
 services/proto/proto_gen/templates/proto.j2        |  9 +++----
 .../proto/src/teaclave_access_control_service.rs   |  9 +++++++
 .../proto/src/teaclave_authentication_service.rs   |  7 ++++++
 services/proto/src/teaclave_execution_service.rs   |  3 +++
 services/proto/src/teaclave_frontend_service.rs    | 23 +++++++++++++++++
 services/proto/src/teaclave_storage_service.rs     | 11 ++++++++
 11 files changed, 106 insertions(+), 7 deletions(-)

diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml
index 49800fd..537d58e 100644
--- a/rpc/Cargo.toml
+++ b/rpc/Cargo.toml
@@ -27,6 +27,7 @@ webpki     = { version = "0.21.0" }
 
 teaclave_types       = { path = "../types" }
 teaclave_attestation = { path = "../attestation" }
+teaclave_rpc_proc_macro = { path = "./proc_macro" }
 
 sgx_trts = { version = "1.1.0" }
 sgx_tstd = { version = "1.1.0", features = ["net", "backtrace"], optional = 
true }
diff --git a/rpc/proc_macro/Cargo.toml b/rpc/proc_macro/Cargo.toml
new file mode 100644
index 0000000..9078ec7
--- /dev/null
+++ b/rpc/proc_macro/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "teaclave_rpc_proc_macro"
+version = "0.1.0"
+authors = ["Teaclave Contributors <[email protected]>"]
+license = "Apache-2.0"
+edition = "2018"
+
+[lib]
+proc-macro = true
+
+[dependencies]
+proc-macro2 = "1.0"
+quote = "1.0"
+syn = { version = "1.0", features = ["full"] }
diff --git a/rpc/proc_macro/src/lib.rs b/rpc/proc_macro/src/lib.rs
new file mode 100644
index 0000000..5afd210
--- /dev/null
+++ b/rpc/proc_macro/src/lib.rs
@@ -0,0 +1,29 @@
+extern crate proc_macro;
+use proc_macro2::{Ident, Span};
+use quote::quote;
+use syn::parse_macro_input;
+use syn::ItemStruct;
+
+use proc_macro::TokenStream;
+
+#[proc_macro_attribute]
+pub fn into_request(attr: TokenStream, input: TokenStream) -> TokenStream {
+    let attr_str = attr.to_string();
+    let splits: Vec<&str> = attr_str.split("::").map(|s| s.trim()).collect();
+    let name = Ident::new(splits[0], Span::call_site());
+    let item = Ident::new(splits[1], Span::call_site());
+    let f = parse_macro_input!(input as ItemStruct);
+    let struct_ident = &f.ident;
+    let q = quote!(
+    #f
+
+
+    impl teaclave_rpc::IntoRequest<#name> for #struct_ident {
+        fn into_request(self) -> teaclave_rpc::Request<#name> {
+            teaclave_rpc::Request::new(#name::#item(self.into()))
+        }
+    }
+    );
+
+    q.into()
+}
diff --git a/rpc/src/lib.rs b/rpc/src/lib.rs
index 69ef2b2..7a403c5 100644
--- a/rpc/src/lib.rs
+++ b/rpc/src/lib.rs
@@ -22,7 +22,8 @@ pub mod config;
 pub mod endpoint;
 mod protocol;
 mod request;
-pub use request::Request;
+pub use request::{IntoRequest, Request};
+pub use teaclave_rpc_proc_macro::into_request;
 pub mod server;
 mod transport;
 mod utils;
diff --git a/rpc/src/request.rs b/rpc/src/request.rs
index b3b8f48..47d1976 100644
--- a/rpc/src/request.rs
+++ b/rpc/src/request.rs
@@ -39,3 +39,7 @@ impl<T> Request<T> {
         &mut self.metadata
     }
 }
+
+pub trait IntoRequest<T> {
+    fn into_request(self) -> Request<T>;
+}
diff --git a/services/proto/proto_gen/templates/proto.j2 
b/services/proto/proto_gen/templates/proto.j2
index 9bf279e..d4b9383 100644
--- a/services/proto/proto_gen/templates/proto.j2
+++ b/services/proto/proto_gen/templates/proto.j2
@@ -74,18 +74,15 @@ impl {{ service.proto_name }}Client {
     }
 
     {%- for m in service.methods %}
-    pub fn {{ m.name }}<T: Into<{{ m.input_type }}>>(
+    pub fn {{ m.name }}<T: teaclave_rpc::IntoRequest<{{ service.proto_name 
}}Request>>(
         &mut self,
         request: T
     ) -> teaclave_types::TeaclaveServiceResponseResult<{{ m.output_type }}> {
         {%- if service.methods.len() > 1 %}
         use std::string::ToString;
         {%- endif %}
-        let request = {{ service.proto_name }}Request::{{ m.proto_name 
}}(request.into());
-        let request = teaclave_rpc::Request {
-            metadata: self.metadata.clone(),
-            message: request,
-        };
+        let mut request = request.into_request();
+        request.metadata = self.metadata.clone();
 
         match self.channel.invoke(request) {
             Ok({{ service.proto_name }}Response::{{ m.proto_name }}(response)) 
=> Ok(response),
diff --git a/services/proto/src/teaclave_access_control_service.rs 
b/services/proto/src/teaclave_access_control_service.rs
index 4b71116..95b9b1e 100644
--- a/services/proto/src/teaclave_access_control_service.rs
+++ b/services/proto/src/teaclave_access_control_service.rs
@@ -1,12 +1,14 @@
 use crate::teaclave_access_control_service_proto as proto;
 use anyhow::{Error, Result};
 use std::prelude::v1::*;
+use teaclave_rpc::into_request;
 
 pub use proto::TeaclaveAccessControl;
 pub use proto::TeaclaveAccessControlClient;
 pub use proto::TeaclaveAccessControlRequest;
 pub use proto::TeaclaveAccessControlResponse;
 
+#[into_request(TeaclaveAccessControlRequest::AuthorizeData)]
 #[derive(Debug)]
 pub struct AuthorizeDataRequest {
     pub subject_user_id: String,
@@ -22,6 +24,7 @@ impl AuthorizeDataRequest {
     }
 }
 
+#[into_request(TeaclaveAccessControlResponse::AuthorizeData)]
 #[derive(Debug)]
 pub struct AuthorizeDataResponse {
     pub accept: bool,
@@ -33,6 +36,7 @@ impl AuthorizeDataResponse {
     }
 }
 
+#[into_request(TeaclaveAccessControlRequest::AuthorizeFunction)]
 #[derive(Debug)]
 pub struct AuthorizeFunctionRequest {
     pub subject_user_id: String,
@@ -48,6 +52,7 @@ impl AuthorizeFunctionRequest {
     }
 }
 
+#[into_request(TeaclaveAccessControlResponse::AuthorizeFunction)]
 #[derive(Debug)]
 pub struct AuthorizeFunctionResponse {
     pub accept: bool,
@@ -59,6 +64,7 @@ impl AuthorizeFunctionResponse {
     }
 }
 
+#[into_request(TeaclaveAccessControlRequest::AuthorizeTask)]
 #[derive(Debug)]
 pub struct AuthorizeTaskRequest {
     pub subject_user_id: String,
@@ -74,6 +80,7 @@ impl AuthorizeTaskRequest {
     }
 }
 
+#[into_request(TeaclaveAccessControlResponse::AuthorizeTask)]
 #[derive(Debug)]
 pub struct AuthorizeTaskResponse {
     pub accept: bool,
@@ -85,6 +92,7 @@ impl AuthorizeTaskResponse {
     }
 }
 
+#[into_request(TeaclaveAccessControlRequest::AuthorizeStagedTask)]
 #[derive(Debug)]
 pub struct AuthorizeStagedTaskRequest {
     pub subject_task_id: String,
@@ -93,6 +101,7 @@ pub struct AuthorizeStagedTaskRequest {
     pub object_output_data_id_list: Vec<String>,
 }
 
+#[into_request(TeaclaveAccessControlResponse::AuthorizeStagedTask)]
 #[derive(Debug)]
 pub struct AuthorizeStagedTaskResponse {
     pub accept: bool,
diff --git a/services/proto/src/teaclave_authentication_service.rs 
b/services/proto/src/teaclave_authentication_service.rs
index 2099aa9..2c453b9 100644
--- a/services/proto/src/teaclave_authentication_service.rs
+++ b/services/proto/src/teaclave_authentication_service.rs
@@ -2,6 +2,7 @@ use anyhow::anyhow;
 use anyhow::{Error, Result};
 use core::convert::TryInto;
 use std::prelude::v1::*;
+use teaclave_rpc::into_request;
 
 use crate::teaclave_authentication_service_proto as proto;
 use crate::teaclave_common;
@@ -14,6 +15,7 @@ pub use proto::TeaclaveAuthenticationInternalClient;
 pub use proto::TeaclaveAuthenticationInternalRequest;
 pub use proto::TeaclaveAuthenticationInternalResponse;
 
+#[into_request(TeaclaveAuthenticationApiRequest::UserRegister)]
 #[derive(Debug)]
 pub struct UserRegisterRequest {
     pub id: std::string::String,
@@ -29,9 +31,11 @@ impl UserRegisterRequest {
     }
 }
 
+#[into_request(TeaclaveAuthenticationApiResponse::UserRegister)]
 #[derive(Debug, Default)]
 pub struct UserRegisterResponse;
 
+#[into_request(TeaclaveAuthenticationApiRequest::UserLogin)]
 #[derive(Debug)]
 pub struct UserLoginRequest {
     pub id: std::string::String,
@@ -47,6 +51,7 @@ impl UserLoginRequest {
     }
 }
 
+#[into_request(TeaclaveAuthenticationApiResponse::UserLogin)]
 #[derive(Debug)]
 pub struct UserLoginResponse {
     pub token: std::string::String,
@@ -60,6 +65,7 @@ impl UserLoginResponse {
     }
 }
 
+#[into_request(TeaclaveAuthenticationInternalRequest::UserAuthenticate)]
 #[derive(Debug)]
 pub struct UserAuthenticateRequest {
     pub credential: teaclave_common::UserCredential,
@@ -71,6 +77,7 @@ impl UserAuthenticateRequest {
     }
 }
 
+#[into_request(TeaclaveAuthenticationInternalResponse::UserAuthenticate)]
 #[derive(Debug)]
 pub struct UserAuthenticateResponse {
     pub accept: bool,
diff --git a/services/proto/src/teaclave_execution_service.rs 
b/services/proto/src/teaclave_execution_service.rs
index 7d1b3f2..ced78cc 100644
--- a/services/proto/src/teaclave_execution_service.rs
+++ b/services/proto/src/teaclave_execution_service.rs
@@ -2,6 +2,7 @@ use std::prelude::v1::*;
 
 use anyhow::{anyhow, Error, Result};
 use core::convert::TryInto;
+use teaclave_rpc::into_request;
 use teaclave_types::{TeaclaveFunctionArguments, TeaclaveWorkerFileInfo, 
WorkerInvocation};
 
 use crate::teaclave_execution_service_proto as proto;
@@ -10,11 +11,13 @@ pub use proto::TeaclaveExecutionClient;
 pub use proto::TeaclaveExecutionRequest;
 pub use proto::TeaclaveExecutionResponse;
 
+#[into_request(TeaclaveExecutionRequest::InvokeFunction)]
 #[derive(Debug)]
 pub struct StagedFunctionExecuteRequest {
     pub invocation: WorkerInvocation,
 }
 
+#[into_request(TeaclaveExecutionResponse::InvokeFunction)]
 #[derive(Debug)]
 pub struct StagedFunctionExecuteResponse {
     pub summary: std::string::String,
diff --git a/services/proto/src/teaclave_frontend_service.rs 
b/services/proto/src/teaclave_frontend_service.rs
index 762f24f..b0f1468 100644
--- a/services/proto/src/teaclave_frontend_service.rs
+++ b/services/proto/src/teaclave_frontend_service.rs
@@ -1,4 +1,6 @@
 use crate::teaclave_frontend_service_proto as proto;
+use crate::teaclave_management_service::TeaclaveManagementRequest;
+use crate::teaclave_management_service::TeaclaveManagementResponse;
 use anyhow::anyhow;
 use anyhow::{Error, Result};
 use core::convert::TryInto;
@@ -6,6 +8,7 @@ use core::iter::FromIterator;
 use serde::{Deserialize, Serialize};
 use std::collections::{HashMap, HashSet};
 use std::prelude::v1::*;
+use teaclave_rpc::into_request;
 use teaclave_types::TeaclaveFileCryptoInfo;
 use url::Url;
 
@@ -14,6 +17,8 @@ pub use proto::TeaclaveFrontendClient;
 pub use proto::TeaclaveFrontendRequest;
 pub use proto::TeaclaveFrontendResponse;
 
+#[into_request(TeaclaveFrontendRequest::RegisterInputFile)]
+#[into_request(TeaclaveManagementRequest::RegisterInputFile)]
 #[derive(Debug)]
 pub struct RegisterInputFileRequest {
     pub url: Url,
@@ -21,37 +26,47 @@ pub struct RegisterInputFileRequest {
     pub crypto_info: TeaclaveFileCryptoInfo,
 }
 
+#[into_request(TeaclaveFrontendResponse::RegisterInputFile)]
+#[into_request(TeaclaveManagementResponse::RegisterInputFile)]
 #[derive(Debug)]
 pub struct RegisterInputFileResponse {
     pub data_id: String,
 }
 
+#[into_request(TeaclaveFrontendRequest::RegisterOutputFile)]
+#[into_request(TeaclaveManagementRequest::RegisterOutputFile)]
 #[derive(Debug)]
 pub struct RegisterOutputFileRequest {
     pub url: Url,
     pub crypto_info: TeaclaveFileCryptoInfo,
 }
 
+#[into_request(TeaclaveFrontendResponse::RegisterOutputFile)]
+#[into_request(TeaclaveManagementResponse::RegisterOutputFile)]
 #[derive(Debug)]
 pub struct RegisterOutputFileResponse {
     pub data_id: String,
 }
 
+#[into_request(TeaclaveManagementRequest::GetOutputFile)]
 #[derive(Debug)]
 pub struct GetOutputFileRequest {
     pub data_id: String,
 }
 
+#[into_request(TeaclaveManagementResponse::GetOutputFile)]
 #[derive(Debug)]
 pub struct GetOutputFileResponse {
     pub hash: String,
 }
 
+#[into_request(TeaclaveManagementRequest::GetFusionData)]
 #[derive(Debug)]
 pub struct GetFusionDataRequest {
     pub data_id: String,
 }
 
+#[into_request(TeaclaveManagementResponse::GetFusionData)]
 #[derive(Debug)]
 pub struct GetFusionDataResponse {
     pub hash: String,
@@ -70,6 +85,7 @@ pub struct FunctionOutput {
     pub description: String,
 }
 
+#[into_request(TeaclaveManagementRequest::RegisterFunction)]
 #[derive(Debug)]
 pub struct RegisterFunctionRequest {
     pub name: String,
@@ -81,16 +97,19 @@ pub struct RegisterFunctionRequest {
     pub output_list: Vec<FunctionOutput>,
 }
 
+#[into_request(TeaclaveManagementResponse::RegisterFunction)]
 #[derive(Debug)]
 pub struct RegisterFunctionResponse {
     pub function_id: String,
 }
 
+#[into_request(TeaclaveManagementRequest::GetFunction)]
 #[derive(Debug)]
 pub struct GetFunctionRequest {
     pub function_id: String,
 }
 
+#[into_request(TeaclaveManagementResponse::GetFunction)]
 #[derive(Debug)]
 pub struct GetFunctionResponse {
     pub name: String,
@@ -108,6 +127,7 @@ pub struct DataOwnerList {
     pub user_id_list: HashSet<String>,
 }
 
+#[into_request(TeaclaveManagementRequest::CreateTask)]
 #[derive(Debug)]
 pub struct CreateTaskRequest {
     pub function_id: String,
@@ -116,6 +136,7 @@ pub struct CreateTaskRequest {
     pub output_data_owner_list: HashMap<String, DataOwnerList>,
 }
 
+#[into_request(TeaclaveManagementResponse::CreateTask)]
 #[derive(Debug)]
 pub struct CreateTaskResponse {
     pub task_id: String,
@@ -137,11 +158,13 @@ pub enum TaskStatus {
     Finished,
 }
 
+#[into_request(TeaclaveManagementRequest::GetTask)]
 #[derive(Debug)]
 pub struct GetTaskRequest {
     pub task_id: String,
 }
 
+#[into_request(TeaclaveManagementResponse::GetTask)]
 #[derive(Debug)]
 pub struct GetTaskResponse {
     pub task_id: String,
diff --git a/services/proto/src/teaclave_storage_service.rs 
b/services/proto/src/teaclave_storage_service.rs
index 6e1b200..ebcbb72 100644
--- a/services/proto/src/teaclave_storage_service.rs
+++ b/services/proto/src/teaclave_storage_service.rs
@@ -6,7 +6,9 @@ pub use proto::TeaclaveStorage;
 pub use proto::TeaclaveStorageClient;
 pub use proto::TeaclaveStorageRequest;
 pub use proto::TeaclaveStorageResponse;
+use teaclave_rpc::into_request;
 
+#[into_request(TeaclaveStorageRequest::Get)]
 #[derive(Debug)]
 pub struct GetRequest {
     pub key: Vec<u8>,
@@ -18,6 +20,7 @@ impl GetRequest {
     }
 }
 
+#[into_request(TeaclaveStorageResponse::Get)]
 #[derive(Debug)]
 pub struct GetResponse {
     pub value: Vec<u8>,
@@ -31,6 +34,7 @@ impl GetResponse {
     }
 }
 
+#[into_request(TeaclaveStorageRequest::Put)]
 #[derive(Debug)]
 pub struct PutRequest {
     pub key: Vec<u8>,
@@ -46,9 +50,11 @@ impl PutRequest {
     }
 }
 
+#[into_request(TeaclaveStorageResponse::Put)]
 #[derive(Debug, Default)]
 pub struct PutResponse;
 
+#[into_request(TeaclaveStorageRequest::Delete)]
 #[derive(Debug)]
 pub struct DeleteRequest {
     pub key: Vec<u8>,
@@ -60,9 +66,11 @@ impl DeleteRequest {
     }
 }
 
+#[into_request(TeaclaveStorageResponse::Delete)]
 #[derive(Debug, Default)]
 pub struct DeleteResponse;
 
+#[into_request(TeaclaveStorageRequest::Enqueue)]
 #[derive(Debug)]
 pub struct EnqueueRequest {
     pub key: Vec<u8>,
@@ -78,9 +86,11 @@ impl EnqueueRequest {
     }
 }
 
+#[into_request(TeaclaveStorageResponse::Enqueue)]
 #[derive(Debug, Default)]
 pub struct EnqueueResponse;
 
+#[into_request(TeaclaveStorageRequest::Dequeue)]
 #[derive(Debug)]
 pub struct DequeueRequest {
     pub key: Vec<u8>,
@@ -92,6 +102,7 @@ impl DequeueRequest {
     }
 }
 
+#[into_request(TeaclaveStorageResponse::Dequeue)]
 #[derive(Debug)]
 pub struct DequeueResponse {
     pub value: Vec<u8>,


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to