serialize_fields 0.2.2

Dynamic field selection for struct serialization in Rust
Documentation

SerializeFields

A Rust procedural macro that enables dynamic field selection for struct serialization. Control exactly which fields get serialized at runtime using a hierarchical field selector system.

Features

  • 🎯 Dynamic Field Selection: Choose which fields to serialize at runtime
  • 🌳 Hierarchical Selection: Use dot notation for nested structs ("user.profile.name")
  • 🔧 Type Safe: Compile-time validation of field paths
  • 🚀 Zero Runtime Cost: Only enabled fields are processed during serialization
  • 📦 Serde Integration: Works seamlessly with the serde ecosystem
  • 🔄 Collection Support: Handles Vec, Option, HashMap, and other containers
  • 🏗️ Generic Architecture: Single trait-based serialization implementation

Quick Start

use serialize_fields::{SerializeFields, SerializeFieldsTrait};
use serde::{Serialize, Deserialize};

#[derive(SerializeFields, Serialize, Deserialize)]
struct User {
    id: u32,
    name: Option<String>,
    email: Option<String>,
}

let user = User {
    id: 123,
    name: Some("Alice".to_string()),
    email: Some("alice@example.com".to_string()),
};

// Create field selector using the trait method
let mut fields = user.serialize_fields();
fields.enable_dot_hierarchy("id");
fields.enable_dot_hierarchy("name");

// Serialize with selected fields only
let json = serde_json::to_string(&SerializeFields(&user, &fields)).unwrap();
// Output: {"id":123,"name":"Alice"}

Advanced Usage

Nested Structs

# use serialize_fields::{SerializeFields, SerializeFieldsTrait};
# use serde::{Serialize, Deserialize};
#[derive(SerializeFields, Serialize, Deserialize)]
struct User {
    id: u32,
    profile: UserProfile,
}

#[derive(SerializeFields, Serialize, Deserialize)]
struct UserProfile {
    bio: Option<String>,
    avatar_url: Option<String>,
}

# let user = User {
#     id: 123,
#     profile: UserProfile {
#         bio: Some("Software Engineer".to_string()),
#         avatar_url: Some("https://example.com/avatar.jpg".to_string()),
#     },
# };
let mut fields = user.serialize_fields();
fields.enable_dot_hierarchy("id");
fields.enable_dot_hierarchy("profile.bio");  // Nested field selection

let json = serde_json::to_string(&SerializeFields(&user, &fields)).unwrap();
// Output: {"id":123,"profile":{"bio":"Software Engineer"}}

Dynamic Field Selection

# use serialize_fields::{SerializeFields, SerializeFieldsTrait};
# use serde::{Serialize, Deserialize};
# #[derive(SerializeFields, Serialize, Deserialize)]
# struct User { id: u32, name: Option<String>, email: Option<String> }
# let user = User { id: 123, name: Some("Alice".to_string()), email: Some("alice@example.com".to_string()) };
fn serialize_user_with_fields(user: &User, requested_fields: &[&str]) -> String {
    let mut selector = user.serialize_fields();
    
    for field in requested_fields {
        selector.enable_dot_hierarchy(field);
    }
    
    serde_json::to_string(&SerializeFields(user, &selector)).unwrap()
}

// Usage: GET /users/123?fields=id,name
let fields = vec!["id", "name"];
let json = serialize_user_with_fields(&user, &fields);