diff --git a/Cargo.lock b/Cargo.lock index 86d564e..2c32ed1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -457,6 +457,26 @@ dependencies = [ "libc", ] +[[package]] +name = "crabtime" +version = "1.1.3" +source = "git+https://github.com/wdanilo/crabtime.git?rev=2ed856f5#2ed856f5f8b85a1e81598d64a36305a1d3f17d01" +dependencies = [ + "crabtime-internal", +] + +[[package]] +name = "crabtime-internal" +version = "1.1.3" +source = "git+https://github.com/wdanilo/crabtime.git?rev=2ed856f5#2ed856f5f8b85a1e81598d64a36305a1d3f17d01" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.104", + "toml", +] + [[package]] name = "crc32fast" version = "1.5.0" @@ -1433,6 +1453,7 @@ dependencies = [ "chrono", "cipher", "compio", + "crabtime", "digest", "flate2", "hmac-sha256", @@ -1503,6 +1524,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + [[package]] name = "shlex" version = "1.3.0" @@ -1755,11 +1785,26 @@ dependencies = [ "syn 2.0.104", ] +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + [[package]] name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] [[package]] name = "toml_edit" @@ -1768,10 +1813,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", + "serde", + "serde_spanned", "toml_datetime", + "toml_write", "winnow", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "tracing" version = "0.1.41" diff --git a/sdgb-api/Cargo.toml b/sdgb-api/Cargo.toml index 2a7cff3..3a76a81 100644 --- a/sdgb-api/Cargo.toml +++ b/sdgb-api/Cargo.toml @@ -39,3 +39,6 @@ cbc = { version = "0.1.2", features = ["alloc"] } aes = "0.8.4" cipher = { version = "0.4.4", features = ["block-padding"] } bincode = { version = "2.0.1", optional = true } + +# magic macro +crabtime = { git = "https://github.com/wdanilo/crabtime.git", rev = "2ed856f5" } diff --git a/sdgb-api/src/title/methods/mod.rs b/sdgb-api/src/title/methods/mod.rs index 9a3f2da..4ef1164 100644 --- a/sdgb-api/src/title/methods/mod.rs +++ b/sdgb-api/src/title/methods/mod.rs @@ -1,3 +1,5 @@ +use serde::{Deserialize, Serialize}; + #[derive(strum::IntoStaticStr)] pub enum APIMethod { GetGameChargeApi, @@ -45,6 +47,36 @@ pub enum APIMethod { UserLogoutApi, } +pub trait APIExt { + const METHOD: APIMethod; + type Payload: Serialize + Send + 'static; + type Output: for<'de> Deserialize<'de>; +} + +#[crabtime::function] +fn api_implement(api_names: Vec) { + for api_name in api_names { + let api_name = api_name; + crabtime::output!( + pub struct {{api_name}}; + + impl APIExt for {{api_name}} { + const METHOD: APIMethod = APIMethod::{{api_name}}; + type Payload = crate::title::model::{{api_name}}; + type Output = crate::title::model::{{api_name}}Resp; + } + ); + } +} + +api_implement!([ + "Ping", + "UserLoginApi", + "UserLogoutApi", + "GetUserDataApi", + "GetUserPreviewApi", +]); + #[cfg(test)] mod _test { use crate::title::{MaiVersionExt, Sdgb1_50, methods::APIMethod}; diff --git a/sdgb-api/src/title/mod.rs b/sdgb-api/src/title/mod.rs index 619eda0..24e579d 100644 --- a/sdgb-api/src/title/mod.rs +++ b/sdgb-api/src/title/mod.rs @@ -1,6 +1,6 @@ use std::fmt::Display; -use crate::title::methods::APIMethod; +use crate::title::methods::{APIExt, APIMethod}; pub mod encryption; pub mod methods; @@ -107,6 +107,14 @@ pub trait MaiVersionExt: MaiVersion { Ok(serde_json::from_slice(&raw_data)?) } } + + fn request_ext( + client: &AsyncClient, + data: M::Payload, + agent_extra: impl Display + Send + 'static, + ) -> impl Future> { + Self::request(client, M::METHOD, agent_extra, data) + } } pub struct Sdgb1_40;