From 670033b36b4137bed69c74abe894979a4eb90af1 Mon Sep 17 00:00:00 2001 From: Jeb Bearer Date: Wed, 16 Nov 2022 07:57:57 -0800 Subject: [PATCH] Make serde and ark-serialize optional with feature flags --- .github/workflows/build.yml | 6 ++++++ Cargo.toml | 10 ++++++---- macros/Cargo.toml | 4 ++++ macros/src/lib.rs | 10 +++++++++- src/lib.rs | 10 +++++++++- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fd14500..985055d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -48,6 +48,12 @@ jobs: with: token: ${{ github.token }} + name: Clippy without default features + uses: actions-rs/clippy-check@v1 + with: + token: ${{ github.token }} + args: --no-default-features + - name: Audit uses: actions-rs/audit-check@v1 with: diff --git a/Cargo.toml b/Cargo.toml index 3e872ce..f308120 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,17 +15,19 @@ name = "tagged-base64" required-features = ["build-cli"] [features] -default = [] +default = ["ark-serialize", "serde"] +ark-serialize = ["dep:ark-serialize"] +serde = ["dep:serde", "tagged-base64-macros/serde"] wasm-debug = ["dep:console_error_panic_hook"] build-cli = ["dep:clap"] [dependencies] -ark-serialize = { version = "0.3.0", default-features = false, features = ["derive"] } +ark-serialize = { version = "0.3.0", optional = true, default-features = false, features = ["derive"] } base64 = "0.13.0" crc-any = { version = "2.4.1", default-features = false } -serde = { version = "1.0", features = ["derive"] } +serde = { version = "1.0", optional = true, features = ["derive"] } snafu = { version = "0.7", features = ["backtraces"] } -tagged-base64-macros = { path = "macros" } +tagged-base64-macros = { path = "macros", default-features = false } # Command line argument processing clap = { version = "4.0", optional = true, features = ["derive"] } diff --git a/macros/Cargo.toml b/macros/Cargo.toml index b50634c..62c5d42 100644 --- a/macros/Cargo.toml +++ b/macros/Cargo.toml @@ -8,6 +8,10 @@ edition = "2018" [lib] proc-macro = true +[features] +default-features = ["serde"] +serde = [] + [dependencies] ark-std = { version = "0.3.0", default-features = false } syn = { version = "1.0", features = ["extra-traits"] } diff --git a/macros/src/lib.rs b/macros/src/lib.rs index 1304960..8b9256f 100644 --- a/macros/src/lib.rs +++ b/macros/src/lib.rs @@ -87,13 +87,21 @@ pub fn tagged(args: TokenStream, input: TokenStream) -> TokenStream { x ), }; - let output = quote! { + + #[cfg(feature = "serde")] + let struct_def = quote! { #[derive(serde::Serialize, serde::Deserialize)] #[serde(try_from = "tagged_base64::TaggedBase64", into = "tagged_base64::TaggedBase64")] // Override the inferred bound for Serialize/Deserialize impls. If we're converting to and // from CanonicalBytes as an intermediate, the impls should work for any generic parameters. #[serde(bound = "")] #input + }; + #[cfg(not(feature = "serde"))] + let struct_def = &input; + + let output = quote! { + #struct_def impl #impl_generics tagged_base64::Tagged for #name #ty_generics #where_clause { fn tag() -> ark_std::string::String { diff --git a/src/lib.rs b/src/lib.rs index bf6d872..77313bc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -41,12 +41,14 @@ //! well as display and input in a user interface. #![allow(clippy::unused_unit)] +#[cfg(feature = "ark-serialize")] use ark_serialize::*; use core::fmt; #[cfg(target_arch = "wasm32")] use core::fmt::Display; use core::str::FromStr; use crc_any::CRC; +#[cfg(feature = "serde")] use serde::{ de::{Deserialize, Deserializer, Error as DeError}, ser::{Error as SerError, Serialize, Serializer}, @@ -68,13 +70,18 @@ pub const TB64_CONFIG: base64::Config = base64::URL_SAFE_NO_PAD; /// A structure holding a string tag, vector of bytes, and a checksum /// covering the tag and the bytes. #[cfg_attr(target_arch = "wasm32", wasm_bindgen)] -#[derive(Clone, Debug, Eq, PartialEq, CanonicalSerialize, CanonicalDeserialize)] +#[derive(Clone, Debug, Eq, PartialEq)] +#[cfg_attr( + feature = "ark-serialize", + derive(CanonicalSerialize, CanonicalDeserialize) +)] pub struct TaggedBase64 { tag: String, value: Vec, checksum: u8, } +#[cfg(feature = "serde")] impl Serialize for TaggedBase64 { fn serialize(&self, serializer: S) -> Result where @@ -93,6 +100,7 @@ impl Serialize for TaggedBase64 { } } +#[cfg(feature = "serde")] impl<'a> Deserialize<'a> for TaggedBase64 { fn deserialize(deserializer: D) -> Result where