From 6a4936d8d41f829a91494fa56b864a2db26e40a2 Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Wed, 10 Sep 2025 17:21:48 -0300 Subject: [PATCH] refactor: Conditionalize `utoipa` and `flate2` based on features Conditionalize `utoipa::ToSchema` derives and `#[schema]` attributes on the `server` feature, and `flate2` usage on the `gzip` feature, allowing compilation when these features are disabled. Co-authored-by: aider (openai/andrew/openrouter/sonoma-sky-alpha) --- src/common/status.rs | 11 ++++++----- src/compression_engine/gzip.rs | 18 ++++++++++++++++++ src/config.rs | 11 ++++++++++- src/filter_plugin/mod.rs | 6 +++++- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/common/status.rs b/src/common/status.rs index 3efe049..92bd806 100644 --- a/src/common/status.rs +++ b/src/common/status.rs @@ -1,5 +1,6 @@ use std::path::PathBuf; use strum::IntoEnumIterator; +#[cfg(feature = "server")] use utoipa::ToSchema; use crate::compression_engine; @@ -10,14 +11,14 @@ use crate::meta_plugin::MetaPluginType; use crate::filter_plugin::FilterOption; -#[derive(serde::Serialize, serde::Deserialize, ToSchema, Clone)] +#[derive(serde::Serialize, serde::Deserialize, #[cfg(feature = "server")] ToSchema, Clone)] pub struct FilterPluginInfo { pub name: String, pub options: Vec, pub description: String, } -#[derive(serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(serde::Serialize, serde::Deserialize, #[cfg(feature = "server")] ToSchema)] pub struct StatusInfo { pub paths: PathInfo, pub compression: Vec, @@ -27,13 +28,13 @@ pub struct StatusInfo { pub configured_meta_plugins: Option>, } -#[derive(serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(serde::Serialize, serde::Deserialize, #[cfg(feature = "server")] ToSchema)] pub struct PathInfo { pub data: String, pub database: String, } -#[derive(serde::Serialize, serde::Deserialize, ToSchema)] +#[derive(serde::Serialize, serde::Deserialize, #[cfg(feature = "server")] ToSchema)] pub struct CompressionInfo { #[serde(rename = "type")] pub compression_type: String, @@ -44,7 +45,7 @@ pub struct CompressionInfo { pub decompress: String, } -#[derive(serde::Serialize, serde::Deserialize, ToSchema, Clone)] +#[derive(serde::Serialize, serde::Deserialize, #[cfg(feature = "server")] ToSchema, Clone)] pub struct MetaPluginInfo { pub meta_name: String, pub outputs: std::collections::HashMap, diff --git a/src/compression_engine/gzip.rs b/src/compression_engine/gzip.rs index 8474cdf..deec035 100644 --- a/src/compression_engine/gzip.rs +++ b/src/compression_engine/gzip.rs @@ -1,3 +1,4 @@ +#[cfg(feature = "gzip")] /// GZip compression engine module. /// /// This module provides the implementation for GZip compression and decompression @@ -12,19 +13,30 @@ /// .expect("GZip engine creation failed"); /// let reader = engine.open("/path/to/file.gz".into()).expect("Open failed"); /// ``` +#[cfg(feature = "gzip")] use anyhow::Result; +#[cfg(feature = "gzip")] use log::*; +#[cfg(feature = "gzip")] use std::fs::File; +#[cfg(feature = "gzip")] use std::io; +#[cfg(feature = "gzip")] use std::io::{Read, Write}; +#[cfg(feature = "gzip")] use std::path::PathBuf; +#[cfg(feature = "gzip")] use flate2::Compression; +#[cfg(feature = "gzip")] use flate2::read::GzDecoder; +#[cfg(feature = "gzip")] use flate2::write::GzEncoder; +#[cfg(feature = "gzip")] use crate::compression_engine::CompressionEngine; +#[cfg(feature = "gzip")] #[derive(Debug, Eq, PartialEq, Clone, Default)] /// GZip compression engine implementation. /// @@ -33,6 +45,7 @@ use crate::compression_engine::CompressionEngine; /// with the keep system's compression framework. pub struct CompressionEngineGZip {} +#[cfg(feature = "gzip")] impl CompressionEngineGZip { /// Creates a new instance of `CompressionEngineGZip`. /// @@ -50,6 +63,7 @@ impl CompressionEngineGZip { } } +#[cfg(feature = "gzip")] impl CompressionEngine for CompressionEngineGZip { /// Checks if GZip compression is supported. /// @@ -132,6 +146,7 @@ impl CompressionEngine for CompressionEngineGZip { } } +#[cfg(feature = "gzip")] #[derive(Debug)] /// Wrapper around `GzEncoder` that automatically finishes the compression stream on drop. /// @@ -141,6 +156,7 @@ pub struct AutoFinishGzEncoder { encoder: Option>, } +#[cfg(feature = "gzip")] impl AutoFinishGzEncoder { /// Creates a new `AutoFinishGzEncoder` wrapping the given GZip encoder. /// @@ -166,6 +182,7 @@ impl AutoFinishGzEncoder { } } +#[cfg(feature = "gzip")] impl Drop for AutoFinishGzEncoder { /// Automatically finishes the GZip encoding when the writer is dropped. /// @@ -183,6 +200,7 @@ impl Drop for AutoFinishGzEncoder { } } +#[cfg(feature = "gzip")] impl Write for AutoFinishGzEncoder { /// Writes data to the underlying GZip encoder. /// diff --git a/src/config.rs b/src/config.rs index c891f66..7417275 100644 --- a/src/config.rs +++ b/src/config.rs @@ -153,15 +153,24 @@ pub struct CompressionPluginConfig { pub name: String, } -#[derive(Debug, Clone, Deserialize, Serialize, utoipa::ToSchema)] +#[derive(Debug, Clone, Deserialize, Serialize, #[cfg(feature = "server")] utoipa::ToSchema)] +#[cfg_attr(not(feature = "server"), derive(Debug, Clone, Deserialize, Serialize))] pub struct MetaPluginConfig { pub name: String, + #[cfg(feature = "server")] #[schema(value_type = Object)] #[serde(default)] pub options: std::collections::HashMap, + #[cfg(not(feature = "server"))] + #[serde(default)] + pub options: std::collections::HashMap, + #[cfg(feature = "server")] #[schema(value_type = Object)] #[serde(default)] pub outputs: std::collections::HashMap, + #[cfg(not(feature = "server"))] + #[serde(default)] + pub outputs: std::collections::HashMap, } /// Unified settings that merges config file and CLI arguments diff --git a/src/filter_plugin/mod.rs b/src/filter_plugin/mod.rs index d25c608..32839e6 100644 --- a/src/filter_plugin/mod.rs +++ b/src/filter_plugin/mod.rs @@ -40,11 +40,15 @@ pub use strip_ansi::StripAnsiFilter; /// * `name` - Option name. /// * `default` - Optional default value. /// * `required` - If true, must be provided. -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, utoipa::ToSchema)] +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, #[cfg(feature = "server")] utoipa::ToSchema)] +#[cfg_attr(not(feature = "server"), derive(Debug, Clone, serde::Serialize, serde::Deserialize))] pub struct FilterOption { pub name: String, + #[cfg(feature = "server")] #[schema(value_type = Option)] pub default: Option, + #[cfg(not(feature = "server"))] + pub default: Option, pub required: bool, }