Add serialize support for enums

This commit is contained in:
Josh Holmer 2023-01-24 02:38:11 -05:00
parent 42448a8d45
commit fe89e158c0
35 changed files with 120 additions and 1 deletions

View File

@ -1,3 +1,7 @@
## Version 1.1.0
- Add `serialize` feature, off by default, which derives `serde::{Serialize, Deserialize}` for as many types as possible
## Version 1.0.1 ## Version 1.0.1
- Remove the "ffmpeg4.x" features that were supposed to have been removed when ffmpeg5 was released. - Remove the "ffmpeg4.x" features that were supposed to have been removed when ffmpeg5 was released.

View File

@ -1,6 +1,6 @@
[package] [package]
name = "ffmpeg-the-third" name = "ffmpeg-the-third"
version = "1.0.1+ffmpeg-5.1.2" version = "1.1.0+ffmpeg-5.1.2"
build = "build.rs" build = "build.rs"
authors = ["meh. <meh@schizofreni.co>", "Zhiming Wang <i@zhimingwang.org>"] authors = ["meh. <meh@schizofreni.co>", "Zhiming Wang <i@zhimingwang.org>"]
@ -31,6 +31,8 @@ build = ["static", "ffmpeg-sys-the-third/build"]
# mark enums in generated bindings as #[non_exhaustive] # mark enums in generated bindings as #[non_exhaustive]
non-exhaustive-enums = ["ffmpeg-sys-the-third/non-exhaustive-enums"] non-exhaustive-enums = ["ffmpeg-sys-the-third/non-exhaustive-enums"]
serialize = ["serde"]
# licensing # licensing
build-license-gpl = ["ffmpeg-sys-the-third/build-license-gpl"] build-license-gpl = ["ffmpeg-sys-the-third/build-license-gpl"]
build-license-nonfree = ["ffmpeg-sys-the-third/build-license-nonfree"] build-license-nonfree = ["ffmpeg-sys-the-third/build-license-nonfree"]
@ -117,3 +119,8 @@ optional = true
[dependencies.ffmpeg-sys-the-third] [dependencies.ffmpeg-sys-the-third]
version = "1.0.0" version = "1.0.0"
default-features = false default-features = false
[dependencies.serde]
version = "1.0.152"
optional = true
features = ["derive"]

View File

@ -1,7 +1,10 @@
use ffi::AVAudioServiceType::*; use ffi::AVAudioServiceType::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum AudioService { pub enum AudioService {
Main, Main,
Effects, Effects,

View File

@ -1,7 +1,10 @@
use ffi::*; use ffi::*;
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Compliance { pub enum Compliance {
VeryStrict, VeryStrict,
Strict, Strict,

View File

@ -1,7 +1,10 @@
use ffi::AVDiscard::*; use ffi::AVDiscard::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Discard { pub enum Discard {
None, None,
Default, Default,

View File

@ -1,7 +1,10 @@
use ffi::*; use ffi::*;
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Comparison { pub enum Comparison {
SAD, SAD,
SSE, SSE,

View File

@ -1,7 +1,10 @@
use ffi::*; use ffi::*;
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Decision { pub enum Decision {
Simple, Simple,
Bits, Bits,

View File

@ -1,6 +1,9 @@
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum MotionEstimation { pub enum MotionEstimation {
Zero, Zero,
Full, Full,

View File

@ -1,7 +1,10 @@
use ffi::*; use ffi::*;
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Prediction { pub enum Prediction {
Left, Left,
Plane, Plane,

View File

@ -1,7 +1,10 @@
use ffi::AVFieldOrder::*; use ffi::AVFieldOrder::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum FieldOrder { pub enum FieldOrder {
Unknown, Unknown,
Progressive, Progressive,

View File

@ -3,10 +3,13 @@ use std::str::from_utf8_unchecked;
use ffi::AVCodecID::*; use ffi::AVCodecID::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
use util::media; use util::media;
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Id { pub enum Id {
None, None,

View File

@ -4,8 +4,11 @@ use std::slice;
use super::Packet; use super::Packet;
use ffi::AVPacketSideDataType::*; use ffi::AVPacketSideDataType::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Type { pub enum Type {
Palette, Palette,
NewExtraData, NewExtraData,

View File

@ -1,9 +1,12 @@
use super::Id; use super::Id;
use ffi::*; use ffi::*;
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Profile { pub enum Profile {
Unknown, Unknown,
Reserved, Reserved,
@ -21,6 +24,7 @@ pub enum Profile {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum AAC { pub enum AAC {
Main, Main,
Low, Low,
@ -37,6 +41,7 @@ pub enum AAC {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum DTS { pub enum DTS {
Default, Default,
ES, ES,
@ -48,6 +53,7 @@ pub enum DTS {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum MPEG2 { pub enum MPEG2 {
_422, _422,
High, High,
@ -59,6 +65,7 @@ pub enum MPEG2 {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum H264 { pub enum H264 {
Constrained, Constrained,
Intra, Intra,
@ -79,6 +86,7 @@ pub enum H264 {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum VC1 { pub enum VC1 {
Simple, Simple,
Main, Main,
@ -88,6 +96,7 @@ pub enum VC1 {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum MPEG4 { pub enum MPEG4 {
Simple, Simple,
SimpleScalable, SimpleScalable,
@ -109,6 +118,7 @@ pub enum MPEG4 {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum JPEG2000 { pub enum JPEG2000 {
CStreamRestriction0, CStreamRestriction0,
CStreamRestriction1, CStreamRestriction1,
@ -119,6 +129,7 @@ pub enum JPEG2000 {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum HEVC { pub enum HEVC {
Main, Main,
Main10, Main10,
@ -128,6 +139,7 @@ pub enum HEVC {
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum VP9 { pub enum VP9 {
_0, _0,
_1, _1,

View File

@ -13,8 +13,11 @@ use std::mem;
use ffi::AVSubtitleType::*; use ffi::AVSubtitleType::*;
use ffi::*; use ffi::*;
use libc::{c_uint, size_t}; use libc::{c_uint, size_t};
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Type { pub enum Type {
None, None,
Bitmap, Bitmap,

View File

@ -1,5 +1,7 @@
use ffi::*; use ffi::*;
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
pub struct Config { pub struct Config {
@ -42,6 +44,7 @@ impl Default for Config {
} }
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Type { pub enum Type {
None, None,
Frame, Frame,

View File

@ -1,6 +1,9 @@
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug)] #[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Mode { pub enum Mode {
Input, Input,
Output, Output,

View File

@ -9,6 +9,8 @@ pub extern crate ffmpeg_sys_the_third as sys;
#[cfg(feature = "image")] #[cfg(feature = "image")]
extern crate image; extern crate image;
extern crate libc; extern crate libc;
#[cfg(feature = "serialize")]
extern crate serde;
pub use sys as ffi; pub use sys as ffi;

View File

@ -1,7 +1,10 @@
use ffi::SwrDitherType::*; use ffi::SwrDitherType::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Dither { pub enum Dither {
None, None,
Rectangular, Rectangular,

View File

@ -1,7 +1,10 @@
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
use sys::SwrEngine::*; use sys::SwrEngine::*;
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Engine { pub enum Engine {
Software, Software,
SoundExchange, SoundExchange,

View File

@ -1,7 +1,10 @@
use ffi::SwrFilterType::*; use ffi::SwrFilterType::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Filter { pub enum Filter {
Cubic, Cubic,
BlackmanNuttall, BlackmanNuttall,

View File

@ -1,7 +1,10 @@
use ffi::*; use ffi::*;
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum ColorSpace { pub enum ColorSpace {
Default, Default,

View File

@ -1,7 +1,10 @@
use ffi::AVChromaLocation::*; use ffi::AVChromaLocation::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Location { pub enum Location {
Unspecified, Unspecified,
Left, Left,

View File

@ -3,8 +3,11 @@ use std::str::from_utf8_unchecked;
use ffi::AVColorPrimaries::*; use ffi::AVColorPrimaries::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Primaries { pub enum Primaries {
Reserved0, Reserved0,
BT709, BT709,

View File

@ -3,8 +3,11 @@ use std::str::from_utf8_unchecked;
use ffi::AVColorRange::*; use ffi::AVColorRange::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Range { pub enum Range {
Unspecified, Unspecified,
MPEG, MPEG,

View File

@ -3,8 +3,11 @@ use std::str::from_utf8_unchecked;
use ffi::AVColorSpace::*; use ffi::AVColorSpace::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Space { pub enum Space {
RGB, RGB,
BT709, BT709,

View File

@ -3,8 +3,11 @@ use std::str::from_utf8_unchecked;
use ffi::AVColorTransferCharacteristic::*; use ffi::AVColorTransferCharacteristic::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum TransferCharacteristic { pub enum TransferCharacteristic {
Reserved0, Reserved0,
BT709, BT709,

View File

@ -6,6 +6,8 @@ use std::str::from_utf8_unchecked;
use ffi::*; use ffi::*;
use libc::{c_char, c_int}; use libc::{c_char, c_int};
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
// Export POSIX error codes so that users can do something like // Export POSIX error codes so that users can do something like
// //
@ -25,6 +27,7 @@ pub use libc::{
}; };
#[derive(Copy, Clone, PartialEq, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Error { pub enum Error {
Bug, Bug,
Bug2, Bug2,

View File

@ -5,8 +5,11 @@ use std::str::{from_utf8_unchecked, FromStr};
use ffi::AVPixelFormat::*; use ffi::AVPixelFormat::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Pixel { pub enum Pixel {
None, None,

View File

@ -7,8 +7,11 @@ use std::str::from_utf8_unchecked;
use ffi::AVSampleFormat::*; use ffi::AVSampleFormat::*;
use ffi::*; use ffi::*;
use libc::{c_int, c_void}; use libc::{c_int, c_void};
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Sample { pub enum Sample {
None, None,
@ -21,6 +24,7 @@ pub enum Sample {
} }
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Type { pub enum Type {
Packed, Packed,
Planar, Planar,

View File

@ -6,9 +6,12 @@ use std::str::from_utf8_unchecked;
use super::Frame; use super::Frame;
use ffi::AVFrameSideDataType::*; use ffi::AVFrameSideDataType::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
use DictionaryRef; use DictionaryRef;
#[derive(Eq, PartialEq, Copy, Clone, Debug)] #[derive(Eq, PartialEq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Type { pub enum Type {
PanScan, PanScan,
A53CC, A53CC,

View File

@ -2,8 +2,11 @@ use std::convert::TryFrom;
use ffi::*; use ffi::*;
use libc::c_int; use libc::c_int;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Level { pub enum Level {
Quiet, Quiet,
Panic, Panic,

View File

@ -1,7 +1,10 @@
use ffi::AVRounding::*; use ffi::AVRounding::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Rounding { pub enum Rounding {
Zero, Zero,
Infinity, Infinity,

View File

@ -1,7 +1,10 @@
use ffi::AVMediaType::*; use ffi::AVMediaType::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Type { pub enum Type {
Unknown, Unknown,
Video, Video,

View File

@ -3,8 +3,11 @@ pub use self::traits::{Gettable, Iterable, Settable, Target};
use ffi::AVOptionType::*; use ffi::AVOptionType::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(PartialEq, Eq, Copy, Clone, Debug)] #[derive(PartialEq, Eq, Copy, Clone, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Type { pub enum Type {
Flags, Flags,
Int, Int,

View File

@ -1,7 +1,10 @@
use ffi::AVPictureType::*; use ffi::AVPictureType::*;
use ffi::*; use ffi::*;
#[cfg(feature = "serialize")]
use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Clone, Copy, Debug)] #[derive(Eq, PartialEq, Clone, Copy, Debug)]
#[cfg_attr(feature = "serialize", derive(Serialize, Deserialize))]
pub enum Type { pub enum Type {
None, None,
I, I,