#serialization #enums #deserialize #serde #macro

serializable_enum

为不包含数据变体的枚举实现序列化和反序列化的两个宏

5个版本 (3个重大更新)

使用旧的Rust 2015

0.4.0 2017年6月6日
0.3.1 2016年11月28日
0.3.0 2016年2月29日
0.2.0 2016年2月22日
0.1.0 2016年2月18日

#1766编码


2 个crate中使用了(通过 stockfighter

MIT/Apache

11KB
90

可序列化枚举

Travis Build Status Documentation Coverage Status crates.io MIT licensed Apache licensed

概述

提供两个宏,以简化对没有数据变体的枚举的序列化和反序列化。当使用serde序列化没有数据的枚举时,默认的序列化形式为:{"Variant": []}。虽然这对于大多数用例来说都适用,但你可能希望枚举以 "variant" 的形式进行序列化。此crate中的两个宏有助于简化这种序列化和反序列化。

这些宏仅设计用于与 serde 一起使用。

用法

将以下内容添加到您的 Cargo.toml

[dependencies]
serializable_enum = "0.1.0"

并将以下内容添加到您的crate中

#[macro_use] extern crate serializable_enum;

示例

考虑这个结构体

#[derive(Serialize, Deserialize)]
struct Post {
    title: String,
    content: String,
    content_format: ContentFormat,
}

pub enum ContentFormat {
    Html,
    Markdown,
}

假设一个 Post 的实例

let p = Post {
    title: String::from("I <3 serde"),
    content: String::from("awesome content"),
    content_format: ContentFormat::Markdown,
};

在序列化 Post 时,您希望得到以下输出(json

{
  "title": "I <3 serde",
  "content": "awesome content",
  "content_format": "markdown",
}

使用此crate中的宏,我们可以通过以下方式实现(假设实现如上所示的 Post

extern crate serde;
extern crate serde_json;
#[macro_use] extern crate serializable_enum;

#[derive(Debug)]
pub enum Error {
    Parse(String)
}

// You will need display implemented for Error (you should already have this).
impl ::std::fmt::Display for Error {
   fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
       write!(f, "{:?}", self)
   }
}

serializable_enum! {
    /// Supported content formats
    #[derive(Debug, PartialEq)]
    pub enum ContentFormat {
        /// Markdown
        Markdown,
        /// HTML
        Html,
    }
    ContentFormatVisitor
}

impl_as_ref_from_str! {
    ContentFormat {
        Markdown => "markdown",
        Html => "html",
    }
    Error::Parse
}

fn main() {
    let md = ContentFormat::Markdown;
    assert_eq!(serde_json::to_string(&md).unwrap(), "\"markdown\"");
    let des_md: ContentFormat = serde_json::from_str("\"markdown\"").unwrap();
    assert_eq!(md, des_md);
}

serializable_enum 使用提供的访问者类型设置serde的序列化和反序列化,在本例中为 ContentFormatVisitor

impl_as_ref_from_str 为枚举提供实现 AsRefFromStr 特性,使用提供的映射,这些映射用于序列化和反序列化。 Error::Parse 是在您的crate中定义的一个具有 String 数据的 Error 枚举的一个变体。这个变体被用作 FromStrErr 类型。

注意serializable_enum 宏调用 需要

  1. 每个变体的文档注释。

更多信息,请访问文档

许可证

本库的发行条件与Rust类似:双重许可,MIT许可证和Apache许可证(版本2.0)。

有关详情,请参阅LICENSE-APACHELICENSE-MITCOPYRIGHT

依赖

~110–385KB