Serde: nesting two instances of the same struct?

Suppose I have something like

#[derive(serde::Serialize)]
pub struct Instant {
    pub at: DateTime,
    pub sequence: u64,
}

#[derive(serde::Serialize)]
pub struct History {
    pub start: Instant,
    pub end: Option<Instant>,
}

Suppose further that, for application-specific reasons, I want the serialized representation to look like (JSON):

{
  "start_at": "2025-05-13T01:23:45.6789Z",
  "start_sequence": 7,
  "end_at": "2024-05-01T00:00:00.0000Z",
  "end_sequence": 3671
}

I can achieve this a few ways, including by translating my History to a flatter structure using #[serde(into)] before serializing it, implementing Serialize myself, or not nesting structures in this way. What I'd like, however, is to be able to use #[serde(flatten)] to do this - to flatten the fields of Instant into the representation of History, renaming them in the process. Is this possible?

1 Like

What I believe you're looking for is serde_with's with_preifx macro here.

7 Likes

Thank you. That's a wild approach - I don't think I ever would have found it without help.