4 releases (2 breaking)

0.9.0 Feb 21, 2025
0.8.1 Jan 26, 2024
0.8.0 Oct 19, 2023
0.7.0 Jul 6, 2023
0.1.1 Jan 22, 2023

#36 in FFI

Download history 1690/week @ 2024-11-17 2529/week @ 2024-11-24 2226/week @ 2024-12-01 1476/week @ 2024-12-08 1690/week @ 2024-12-15 877/week @ 2024-12-22 1116/week @ 2024-12-29 2428/week @ 2025-01-05 2516/week @ 2025-01-12 2221/week @ 2025-01-19 1607/week @ 2025-01-26 1935/week @ 2025-02-02 1398/week @ 2025-02-09 1984/week @ 2025-02-16 7727/week @ 2025-02-23 3754/week @ 2025-03-02

14,922 downloads per month
Used in 2 crates

MIT license

57KB
807 lines

serde_magnus

serde_magnus converts between Rust and Ruby data structures using Serde and Magnus.

Quick links

Usage

The serde_magnus::serialize function converts from a Rust type implementing the serde::Serialize trait into a Ruby equivalent.

use serde::{Serialize, Deserialize};
use magnus::{eval, Value};
use serde_magnus::serialize;

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Post {
    title: String,
    content: String,
    author: Author,
    tags: Vec<String>
}

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Author {
    name: String,
    email_address: String
}

let post = Post {
    title: "Spring carnival planning update".into(),
    content: "Here's what's new.".into(),
    author: Author {
        name: "Martha".into(),
        email_address: "martha@example.com".into()
    },
    tags: vec![
        "carnival".into(),
        "update".into()
    ]
};

let post: Value = serialize(&post)?;

assert!(eval!(
    r#"
    post == {
      title: "Spring carnival planning update",
      content: "Here's what's new.",
      author: {
        name: "Martha",
        email_address: "martha@example.com"
      },
      tags: ["carnival", "update"]
    }
    "#,
    post
)?);

serde_magnus::deserialize converts from a Ruby value to a Rust type implementing serde::Deserialize.

use magnus::RHash;
use serde_magnus::deserialize;

let post: RHash = eval!(r#"
  {
    title: "Spring carnival planning update",
    content: "Here's what's new.",
    author: {
      name: "Martha",
      email_address: "martha@example.com"
    },
    tags: ["carnival", "update"]
  }
"#)?;

let post: Post = deserialize(post)?;

assert_eq!(
    Post {
        title: "Spring carnival planning update".into(),
        content: "Here's what's new.".into(),
        author: Author {
            name: "Martha".into(),
            email_address: "martha@example.com".into(),
        },
        tags: vec![
            "carnival".into(),
            "update".into()
        ]
    },
    post
);

Requirements

serde_magnus requires Rust 1.65+ and Ruby 3.0+.

License

serde_magnus is released under the terms of the MIT License. See LICENSE for details.

Dependencies

~1.5–4.5MB
~74K SLoC