SerdeField

Derive Macro SerdeField 

Source
#[derive(SerdeField)]
{
    // Attributes available to this derive:
    #[serde]
}
Expand description

Derive enum and constants for Serde field-names.

This macro generates:

  1. A const SERDE_FIELDS: &'static [&'static str] on the struct, containing the serialized names of all fields (taking #[serde(rename = "...")] and #[serde(rename_all = "...")] into account).
  2. An enum named {StructName}SerdeField with variants for each field:
    • Each variant is named after the Rust field name (PascalCase).
    • Each variant is annotated with #[serde(rename = "...")].
  3. Implementations for:
    • as_str() -> &'static str
    • Display
    • From<{StructName}SerdeField> for &'static str
    • From<&{StructName}SerdeField> for &'static str
    • TryFrom<&str> and TryFrom<String> with error Invalid{StructName}SerdeField
    • FromStr
    • AsRef<str>

ยงExample

use serde_fields::SerdeField;
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, SerdeField)]
#[serde(rename_all = "camelCase")]
struct User {
    #[serde(rename = "id")]
    user_id: u32,
    email: String,
}

// Access field-names as string slice
assert_eq!(User::SERDE_FIELDS, &["id", "email"]);

// Use the generated enum
let f = UserSerdeField::UserId;
assert_eq!(f.as_str(), "id");
assert_eq!(f.to_string(), "id");

// TryFrom & FromStr
let parsed: UserSerdeField = "id".parse().unwrap();
assert_eq!(parsed, UserSerdeField::UserId);