diff --git a/.github/workflows/cargo-doc.yml b/.github/workflows/cargo-doc.yml new file mode 100644 index 0000000..017dbe2 --- /dev/null +++ b/.github/workflows/cargo-doc.yml @@ -0,0 +1,35 @@ +name: cargo doc lints + +on: + push: + branches: [ "main", "preserve/*" ] + pull_request: + branches: [ "main", "dev" ] + +jobs: + cargo-doc-lints: + name: Run cargo doc for doc lints + runs-on: ubuntu-latest + permissions: + contents: read + security-events: write + actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Install aditional components for sarif + run: cargo install clippy-sarif sarif-fmt + + - name: Run cargo doc + run: cargo doc --no-deps --all-features --locked --message-format=json | clippy-sarif | sed 's/rust-lang.github.io\/rust-clippy/doc.rust-lang.org\/rustdoc\/lints.html/g' | sed 's/clippy/rustdoc/g' | tee cargo-doc-results.sarif | sarif-fmt + continue-on-error: true + + - name: Upload analysis results to GitHub + uses: github/codeql-action/upload-sarif@v3 + with: + sarif_file: cargo-doc-results.sarif + wait-for-processing: true diff --git a/Cargo.lock b/Cargo.lock index 91c5f98..0ed4864 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -34,7 +34,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom", "once_cell", "version_check", "zerocopy", @@ -292,6 +291,15 @@ dependencies = [ "zeroize", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console_error_panic_hook" version = "0.1.7" @@ -541,9 +549,14 @@ dependencies = [ [[package]] name = "event-listener" -version = "2.5.3" +version = "5.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] [[package]] name = "fastrand" @@ -773,9 +786,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.4" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" dependencies = [ "hashbrown 0.14.5", ] @@ -806,12 +819,9 @@ dependencies = [ [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" -dependencies = [ - "unicode-segmentation", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -1141,9 +1151,9 @@ checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libsqlite3-sys" -version = "0.27.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" +checksum = "0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f" dependencies = [ "cc", "pkg-config", @@ -1227,13 +1237,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "4569e456d394deccd22ce1c1913e6ea0e54519f577285001215d33557431afe4" dependencies = [ + "hermit-abi", "libc", "wasi", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1345,16 +1356,6 @@ dependencies = [ "libm", ] -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - [[package]] name = "object" version = "0.36.1" @@ -1376,6 +1377,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + [[package]] name = "parking_lot" version = "0.12.3" @@ -1597,9 +1604,9 @@ dependencies = [ [[package]] name = "pubserve" -version = "1.1.0-alpha.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1781b2a51798c98a381e839e61bc5ce6426bd89bb9c3f9142de2086a80591cd" +checksum = "6a2cf5f495fc9c61de736666ebcbc473fe28a2a1aaf7e5619e5925b13c0275a4" dependencies = [ "async-trait", ] @@ -1972,9 +1979,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.8.3" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e73139bc5ec2d45e6c5fd85be5a46949c1c39a4c18e56915f5eb4c12f975e377" +checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" dependencies = [ "base64 0.22.1", "chrono", @@ -1990,9 +1997,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.8.3" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b80d3d6b56b64335c0180e5ffde23b3c5e08c14c585b51a15bd0e95393f46703" +checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" dependencies = [ "darling", "proc-macro2", @@ -2068,6 +2075,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -2116,9 +2126,9 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa" +checksum = "27144619c6e5802f1380337a209d2ac1c431002dd74c6e60aebff3c506dc4f0c" dependencies = [ "sqlx-core", "sqlx-macros", @@ -2129,11 +2139,10 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6" +checksum = "a999083c1af5b5d6c071d34a708a19ba3e02106ad82ef7bbd69f5e48266b613b" dependencies = [ - "ahash", "atoi", "byteorder", "bytes", @@ -2147,6 +2156,7 @@ dependencies = [ "futures-intrusive", "futures-io", "futures-util", + "hashbrown 0.14.5", "hashlink", "hex", "indexmap 2.2.6", @@ -2173,22 +2183,22 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127" +checksum = "a23217eb7d86c584b8cbe0337b9eacf12ab76fe7673c513141ec42565698bb88" dependencies = [ "proc-macro2", "quote", "sqlx-core", "sqlx-macros-core", - "syn 1.0.109", + "syn 2.0.70", ] [[package]] name = "sqlx-macros-core" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8" +checksum = "1a099220ae541c5db479c6424bdf1b200987934033c2584f79a0e1693601e776" dependencies = [ "dotenvy", "either", @@ -2204,7 +2214,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn 1.0.109", + "syn 2.0.70", "tempfile", "tokio", "url", @@ -2212,12 +2222,12 @@ dependencies = [ [[package]] name = "sqlx-mysql" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" +checksum = "5afe4c38a9b417b6a9a5eeffe7235d0a106716495536e7727d1c7f4b1ff3eba6" dependencies = [ "atoi", - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.6.0", "byteorder", "bytes", @@ -2255,12 +2265,12 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" +checksum = "b1dbb157e65f10dbe01f729339c06d239120221c9ad9fa0ba8408c4cc18ecf21" dependencies = [ "atoi", - "base64 0.21.7", + "base64 0.22.1", "bitflags 2.6.0", "byteorder", "chrono", @@ -2295,9 +2305,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.4" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa" +checksum = "9b2cdd83c008a622d94499c0006d8ee5f821f36c89b7d625c900e5dc30b5c5ee" dependencies = [ "atoi", "chrono", @@ -2311,10 +2321,10 @@ dependencies = [ "log", "percent-encoding", "serde", + "serde_urlencoded", "sqlx-core", "tracing", "url", - "urlencoding", ] [[package]] @@ -2412,18 +2422,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", @@ -2478,26 +2488,25 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.38.0" +version = "1.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba4f4a02a7a80d6f274636f0aa95c7e383b912d41fe721a31f29e29698585a4a" +checksum = "daa4fb1bc778bd6f04cbfc4bb2d06a7396a8f299dc33ea1900cedaa316f467b1" dependencies = [ "backtrace", "bytes", "libc", "mio", - "num_cpus", "pin-project-lite", "socket2", "tokio-macros", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] name = "tokio-macros" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", @@ -2685,12 +2694,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" -[[package]] -name = "unicode-segmentation" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" - [[package]] name = "unicode_categories" version = "0.1.1" @@ -2730,12 +2733,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "urlencoding" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" - [[package]] name = "utf-8" version = "0.7.6" diff --git a/Cargo.toml b/Cargo.toml index ad0795c..83b7e9d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ repository = "https://github.com/polyphony-chat/chorus" readme = "README.md" keywords = ["spacebar", "discord", "polyphony"] website = ["https://discord.com/invite/m3FpcapGDD"] -rust-version = "1.67.1" +rust-version = "1.70.0" [features] @@ -22,33 +22,33 @@ voice_udp = ["dep:discortp", "dep:crypto_secretbox"] voice_gateway = [] [dependencies] -tokio = { version = "1.35.1", features = ["macros", "sync"] } -serde = { version = "1.0.195", features = ["derive", "rc"] } -serde_json = { version = "1.0.111", features = ["raw_value"] } -serde-aux = "4.3.1" -serde_with = "3.4.0" -serde_repr = "0.1.18" +tokio = { version = "1.38.1", features = ["macros", "sync"] } +serde = { version = "1.0.204", features = ["derive", "rc"] } +serde_json = { version = "1.0.120", features = ["raw_value"] } +serde-aux = "4.5.0" +serde_with = "3.9.0" +serde_repr = "0.1.19" reqwest = { features = [ "multipart", "json", "rustls-tls-webpki-roots", ], version = "=0.11.26", default-features = false } -url = "2.5.0" -chrono = { version = "0.4.31", features = ["serde"] } -regex = "1.10.2" +url = "2.5.2" +chrono = { version = "0.4.38", features = ["serde"] } +regex = "1.10.5" custom_error = "1.9.2" futures-util = "0.3.30" http = "0.2.12" base64 = "0.21.7" -bitflags = { version = "2.4.1", features = ["serde"] } -lazy_static = "1.4.0" +bitflags = { version = "2.6.0", features = ["serde"] } +lazy_static = "1.5.0" poem = { version = "3.0.1", features = ["multipart"], optional = true } -thiserror = "1.0.56" +thiserror = "1.0.63" jsonwebtoken = "8.3.0" -log = "0.4.20" -async-trait = "0.1.77" +log = "0.4.22" +async-trait = "0.1.81" chorus-macros = { path = "./chorus-macros", version = "0" } # Note: version here is used when releasing. This will use the latest release. Make sure to republish the crate when code in macros is changed! -sqlx = { version = "0.7.3", features = [ +sqlx = { version = "0.8.0", features = [ "mysql", "sqlite", "json", @@ -66,24 +66,27 @@ crypto_secretbox = { version = "0.1.1", optional = true } rand = "0.8.5" flate2 = { version = "1.0.30", optional = true } webpki-roots = "0.26.3" -pubserve = { version = "1.1.0-alpha.1", features = ["async", "send"] } +pubserve = { version = "1.1.0", features = ["async", "send"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] -rustls = "0.21.10" +rustls = "0.21.12" tokio-tungstenite = { version = "0.20.1", features = [ "rustls-tls-webpki-roots", ] } hostname = "0.3.1" -getrandom = { version = "0.2.12" } +getrandom = { version = "0.2.15" } [target.'cfg(target_arch = "wasm32")'.dependencies] -getrandom = { version = "0.2.12", features = ["js"] } +getrandom = { version = "0.2.15", features = ["js"] } ws_stream_wasm = "0.7.4" -wasm-bindgen-futures = "0.4.39" +wasm-bindgen-futures = "0.4.42" wasmtimer = "0.2.0" [dev-dependencies] -lazy_static = "1.4.0" +lazy_static = "1.5.0" wasm-bindgen-test = "0.3.42" wasm-bindgen = "0.2.92" simple_logger = { version = "5.0.0", default-features = false } + +[lints.rust] +unexpected_cfgs = { level = "allow", check-cfg = ['cfg(tarpaulin_include)'] } diff --git a/README.md b/README.md index bde7f65..413ec34 100644 --- a/README.md +++ b/README.md @@ -119,11 +119,11 @@ We recommend checking out the "examples" directory, as well as the documentation ## MSRV (Minimum Supported Rust Version) -Rust **1.67.1**. This number might change at any point while Chorus is not yet at version 1.0.0. +Rust **1.70.0**. This number might change at any point while Chorus is not yet at version 1.0.0. ## Development Setup -Make sure that you have at least Rust 1.67.1 installed. You can check your Rust version by running `cargo --version` +Make sure that you have at least Rust 1.70.0 installed. You can check your Rust version by running `cargo --version` in your terminal. To compile for `wasm32-unknown-unknown`, you need to install the `wasm32-unknown-unknown` target. You can do this by running `rustup target add wasm32-unknown-unknown`. diff --git a/chorus-macros/src/lib.rs b/chorus-macros/src/lib.rs index aa4f1bc..1c3a8bd 100644 --- a/chorus-macros/src/lib.rs +++ b/chorus-macros/src/lib.rs @@ -156,7 +156,6 @@ pub fn composite_derive(input: TokenStream) -> TokenStream { } } - #[proc_macro_derive(SqlxBitFlags)] pub fn sqlx_bitflag_derive(input: TokenStream) -> TokenStream { let ast: syn::DeriveInput = syn::parse(input).unwrap(); @@ -165,25 +164,46 @@ pub fn sqlx_bitflag_derive(input: TokenStream) -> TokenStream { quote!{ #[cfg(feature = "sqlx")] - impl sqlx::Type for #name { - fn type_info() -> sqlx::mysql::MySqlTypeInfo { - u64::type_info() + impl sqlx::Type for #name { + fn type_info() -> sqlx::any::AnyTypeInfo { + as sqlx::Type>::type_info() } } #[cfg(feature = "sqlx")] - impl<'q> sqlx::Encode<'q, sqlx::MySql> for #name { - fn encode_by_ref(&self, buf: &mut >::ArgumentBuffer) -> sqlx::encode::IsNull { - u64::encode_by_ref(&self.bits(), buf) + impl<'q> sqlx::Encode<'q, sqlx::Any> for #name { + fn encode_by_ref(&self, buf: &mut ::ArgumentBuffer<'q>) -> Result { + as sqlx::Encode>::encode_by_ref(&self.bits().to_be_bytes().into(), buf) } } #[cfg(feature = "sqlx")] - impl<'q> sqlx::Decode<'q, sqlx::MySql> for #name { - fn decode(value: >::ValueRef) -> Result { - u64::decode(value).map(|d| #name::from_bits(d).unwrap()) + impl<'q> sqlx::Decode<'q, sqlx::Any> for #name { + fn decode(value: ::ValueRef<'q>) -> Result { + let vec = as sqlx::Decode>::decode(value)?; + Ok(Self::from_bits(vec_u8_to_u64(vec)).unwrap()) } } + + /// Converts a [Vec] to an unsigned, 64 bit integer. The [u64] is created using [u64::from_be_bytes]. + /// + /// Empty vectors will result in an output of `0_u64`. Only the first 8 values from the vector are + /// being processed. Any additional values will be skipped. + /// + /// Vectors holding less than 8 values will be treated as a vector holding 8 values, where the + /// missing values are padded with `0_u8`. + fn vec_u8_to_u64(vec: Vec) -> u64 { + let mut buf: [u8; 8] = [0; 8]; + let mut position = 0; + for read in vec.iter() { + buf[position] = *read; + position += 1; + if position > 7 { + break; + } + } + u64::from_be_bytes(buf) + } } .into() } diff --git a/src/types/config/types/guild_configuration.rs b/src/types/config/types/guild_configuration.rs index 53a2d45..fc07d1c 100644 --- a/src/types/config/types/guild_configuration.rs +++ b/src/types/config/types/guild_configuration.rs @@ -162,9 +162,11 @@ impl Display for GuildFeaturesList { } #[cfg(feature = "sqlx")] -impl<'r> sqlx::Decode<'r, sqlx::MySql> for GuildFeaturesList { - fn decode(value: >::ValueRef) -> Result { - let v = >::decode(value)?; +impl<'r> sqlx::Decode<'r, sqlx::Any> for GuildFeaturesList { + fn decode( + value: ::ValueRef<'r>, + ) -> Result { + let v = >::decode(value)?; Ok(Self( v.split(',') .filter(|f| !f.is_empty()) @@ -175,10 +177,13 @@ impl<'r> sqlx::Decode<'r, sqlx::MySql> for GuildFeaturesList { } #[cfg(feature = "sqlx")] -impl<'q> sqlx::Encode<'q, sqlx::MySql> for GuildFeaturesList { - fn encode_by_ref(&self, buf: &mut >::ArgumentBuffer) -> sqlx::encode::IsNull { +impl<'q> sqlx::Encode<'q, sqlx::Any> for GuildFeaturesList { + fn encode_by_ref( + &self, + buf: &mut ::ArgumentBuffer<'q>, + ) -> Result> { if self.is_empty() { - return sqlx::encode::IsNull::Yes; + return Ok(sqlx::encode::IsNull::Yes); } let features = self .iter() @@ -186,18 +191,18 @@ impl<'q> sqlx::Encode<'q, sqlx::MySql> for GuildFeaturesList { .collect::>() .join(","); - >::encode_by_ref(&features, buf) + >::encode_by_ref(&features, buf) } } #[cfg(feature = "sqlx")] -impl sqlx::Type for GuildFeaturesList { - fn type_info() -> sqlx::mysql::MySqlTypeInfo { - >::type_info() +impl sqlx::Type for GuildFeaturesList { + fn type_info() -> sqlx::any::AnyTypeInfo { + >::type_info() } - fn compatible(ty: &sqlx::mysql::MySqlTypeInfo) -> bool { - >::compatible(ty) + fn compatible(ty: &sqlx::any::AnyTypeInfo) -> bool { + >::compatible(ty) } } diff --git a/src/types/entities/application.rs b/src/types/entities/application.rs index f265f21..9c81c19 100644 --- a/src/types/entities/application.rs +++ b/src/types/entities/application.rs @@ -102,7 +102,10 @@ fn compare_install_params( b: &Option>, ) -> bool { match (a, b) { - (Some(a), Some(b)) => a.encode_to_string() == b.encode_to_string(), + (Some(a), Some(b)) => match (a.encode_to_string(), b.encode_to_string()) { + (Ok(a), Ok(b)) => a == b, + _ => false, + }, (None, None) => true, _ => false, } diff --git a/src/types/entities/audit_log.rs b/src/types/entities/audit_log.rs index 17f3275..7c821fc 100644 --- a/src/types/entities/audit_log.rs +++ b/src/types/entities/audit_log.rs @@ -51,7 +51,10 @@ fn compare_options( b: &Option>, ) -> bool { match (a, b) { - (Some(a), Some(b)) => a.encode_to_string() == b.encode_to_string(), + (Some(a), Some(b)) => match (a.encode_to_string(), b.encode_to_string()) { + (Ok(a), Ok(b)) => a == b, + _ => false, + }, (None, None) => true, _ => false, } @@ -69,7 +72,10 @@ fn compare_changes( a: &sqlx::types::Json>>>, b: &sqlx::types::Json>>>, ) -> bool { - a.encode_to_string() == b.encode_to_string() + match (a.encode_to_string(), b.encode_to_string()) { + (Ok(a), Ok(b)) => a == b, + _ => false, + } } #[cfg(not(tarpaulin_include))] diff --git a/src/types/entities/channel.rs b/src/types/entities/channel.rs index 622f14d..3d6cd3a 100644 --- a/src/types/entities/channel.rs +++ b/src/types/entities/channel.rs @@ -156,7 +156,10 @@ fn compare_permission_overwrites( b: &Option>>, ) -> bool { match (a, b) { - (Some(a), Some(b)) => a.encode_to_string() == b.encode_to_string(), + (Some(a), Some(b)) => match (a.encode_to_string(), b.encode_to_string()) { + (Ok(a), Ok(b)) => a == b, + _ => false, + }, (None, None) => true, _ => false, } diff --git a/src/types/entities/user.rs b/src/types/entities/user.rs index 1db4b6f..88b4746 100644 --- a/src/types/entities/user.rs +++ b/src/types/entities/user.rs @@ -116,32 +116,32 @@ impl TryFrom> for ThemeColors { #[cfg(feature = "sqlx")] // TODO: Add tests for Encode and Decode. -impl<'q> sqlx::Encode<'q, sqlx::MySql> for ThemeColors { +impl<'q> sqlx::Encode<'q, sqlx::Any> for ThemeColors { fn encode_by_ref( &self, - buf: &mut >::ArgumentBuffer, - ) -> sqlx::encode::IsNull { + buf: &mut ::ArgumentBuffer<'q>, + ) -> Result> { let mut vec_u8 = Vec::new(); vec_u8.extend_from_slice(&self.inner.0.to_be_bytes()); vec_u8.extend_from_slice(&self.inner.1.to_be_bytes()); - as sqlx::Encode<'q, sqlx::MySql>>::encode_by_ref(&vec_u8, buf) + as sqlx::Encode>::encode_by_ref(&vec_u8, buf) } } #[cfg(feature = "sqlx")] -impl<'d> sqlx::Decode<'d, sqlx::MySql> for ThemeColors { +impl<'d> sqlx::Decode<'d, sqlx::Any> for ThemeColors { fn decode( - value: >::ValueRef, + value: ::ValueRef<'d>, ) -> Result { - let value_vec = as sqlx::Decode<'d, sqlx::MySql>>::decode(value)?; + let value_vec = as sqlx::Decode<'d, sqlx::Any>>::decode(value)?; value_vec.try_into().map_err(|e: ChorusError| e.into()) } } #[cfg(feature = "sqlx")] -impl sqlx::Type for ThemeColors { - fn type_info() -> ::TypeInfo { - >::type_info() +impl sqlx::Type for ThemeColors { + fn type_info() -> ::TypeInfo { + >::type_info() } } diff --git a/src/types/events/heartbeat.rs b/src/types/events/heartbeat.rs index 6008ffb..8be2a52 100644 --- a/src/types/events/heartbeat.rs +++ b/src/types/events/heartbeat.rs @@ -5,14 +5,52 @@ use crate::types::events::WebSocketEvent; use serde::{Deserialize, Serialize}; -#[derive(Debug, Default, Deserialize, Serialize, WebSocketEvent, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +#[derive( + Debug, Deserialize, Serialize, WebSocketEvent, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, +)] pub struct GatewayHeartbeat { pub op: u8, pub d: Option, } -#[derive(Debug, Default, Deserialize, Serialize, Clone, WebSocketEvent, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)] +impl GatewayHeartbeat { + /// The Heartbeat packet a server would receive from a new or fresh Gateway connection. + pub fn first() -> Self { + Self::default() + } + + /// Quickly create a [GatewayHeartbeat] with the correct `opcode` and the given `sequence_number`. + /// + /// Shorthand for + /// ```rs + /// Self { + /// op: 1, + /// d: Some(sequence_number) + /// } + /// ``` + pub fn new(sequence_number: u64) -> Self { + Self { + op: 1, + d: Some(sequence_number), + } + } +} + +impl std::default::Default for GatewayHeartbeat { + fn default() -> Self { + Self { op: 1, d: None } + } +} + +#[derive( + Debug, Deserialize, Serialize, Clone, WebSocketEvent, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, +)] pub struct GatewayHeartbeatAck { pub op: i32, } +impl std::default::Default for GatewayHeartbeatAck { + fn default() -> Self { + Self { op: 11 } + } +} diff --git a/src/types/utils/snowflake.rs b/src/types/utils/snowflake.rs index a021f90..7caffc7 100644 --- a/src/types/utils/snowflake.rs +++ b/src/types/utils/snowflake.rs @@ -99,23 +99,29 @@ impl<'de> serde::Deserialize<'de> for Snowflake { } #[cfg(feature = "sqlx")] -impl sqlx::Type for Snowflake { - fn type_info() -> ::TypeInfo { - >::type_info() +impl sqlx::Type for Snowflake { + fn type_info() -> ::TypeInfo { + >::type_info() } } #[cfg(feature = "sqlx")] -impl<'q> sqlx::Encode<'q, sqlx::MySql> for Snowflake { - fn encode_by_ref(&self, buf: &mut >::ArgumentBuffer) -> sqlx::encode::IsNull { - >::encode_by_ref(&self.0.to_string(), buf) +impl<'q> sqlx::Encode<'q, sqlx::Any> for Snowflake { + fn encode_by_ref( + &self, + buf: &mut ::ArgumentBuffer<'q>, + ) -> Result { + >::encode_by_ref(&self.0.to_string(), buf) } } #[cfg(feature = "sqlx")] -impl<'d> sqlx::Decode<'d, sqlx::MySql> for Snowflake { - fn decode(value: >::ValueRef) -> Result { - >::decode(value).map(|s| s.parse::().map(Snowflake).unwrap()) +impl<'d> sqlx::Decode<'d, sqlx::Any> for Snowflake { + fn decode( + value: ::ValueRef<'d>, + ) -> Result { + >::decode(value) + .map(|s| s.parse::().map(Snowflake).unwrap()) } }