diff --git a/Cargo.lock b/Cargo.lock index 645dde8..b186d8f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -58,6 +58,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-trait" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96cf8829f67d2eab0b2dfa42c5d0ef737e0724e4a82b01b3e292456202b19716" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "atty" version = "0.2.14" @@ -1255,6 +1266,7 @@ name = "pixiv_downloader" version = "0.0.1" dependencies = [ "RustyXML", + "async-trait", "atty", "bindgen", "c_fixed_string", diff --git a/Cargo.toml b/Cargo.toml index 0cb64bb..57609b6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,6 +6,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +async-trait = { version = "0.1", optional = true } atty = "0.2" c_fixed_string = { version = "0.2", optional = true } cfg-if = "1" @@ -45,7 +46,7 @@ cmake = { version = "0.1", optional = true } all = ["exif", "ugoira", "server"] avdict = ["bindgen", "cmake", "flagset"] exif = ["bindgen", "c_fixed_string", "cmake", "link-cplusplus", "utf16string"] -server = ["hyper"] +server = ["async-trait", "hyper"] ugoira = ["avdict", "bindgen", "cmake", "link-cplusplus"] [profile.release-with-debug] diff --git a/src/main.rs b/src/main.rs index 6adac00..acd5d01 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,6 @@ +#[cfg(feature = "async-trait")] +#[macro_use] +extern crate async_trait; #[macro_use] extern crate cfg_if; #[macro_use] diff --git a/src/server/service.rs b/src/server/service.rs index 09362b3..da8f5f3 100644 --- a/src/server/service.rs +++ b/src/server/service.rs @@ -34,7 +34,7 @@ impl Service> for PixivDownloaderSvc { fn call(&mut self, req: Request) -> Self::Future { match self.routes.match_route(&req) { Some(route) => Box::pin(async move { - match route.response(req) { + match route.response(req).await { Ok(data) => Ok(data), Err(e) => { println!("{}", e); diff --git a/src/server/traits.rs b/src/server/traits.rs index e5d368d..8d755d6 100644 --- a/src/server/traits.rs +++ b/src/server/traits.rs @@ -9,20 +9,24 @@ pub trait MatchRoute { fn match_route(&self, req: &Request) -> bool; } +#[async_trait] pub trait ResponseFor { - fn response(&self, req: Request) -> Result, PixivDownloaderError>; + async fn response(&self, req: Request) -> Result, PixivDownloaderError>; } +#[async_trait] pub trait ResponseJsonFor { - fn response_json(&self, req: Request) -> Result; + async fn response_json(&self, req: Request) -> Result; } +#[async_trait] impl ResponseFor for U where - U: ResponseJsonFor, + U: ResponseJsonFor + Sync + Send, + T: Sync + Send + 'static, { - fn response(&self, req: Request) -> Result, PixivDownloaderError> { - let re = self.response_json(req)?; + async fn response(&self, req: Request) -> Result, PixivDownloaderError> { + let re = self.response_json(req).await?; Ok(Response::new(Body::from(re.to_string()))) } } diff --git a/src/server/version.rs b/src/server/version.rs index 9422c4f..4386edd 100644 --- a/src/server/version.rs +++ b/src/server/version.rs @@ -17,8 +17,9 @@ impl VersionContext { } } +#[async_trait] impl ResponseJsonFor for VersionContext { - fn response_json(&self, _req: Request) -> Result { + async fn response_json(&self, _req: Request) -> Result { Ok(json::object! {"version": [0, 0, 1, 0]}) } }