1use serde_derive::{Deserialize, Serialize};
2
3bitflags::bitflags! {
4 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
5 pub struct Extensions: usize {
6 const UNWRAP_NEWTYPES = 0x1;
7 const IMPLICIT_SOME = 0x2;
8 const UNWRAP_VARIANT_NEWTYPES = 0x4;
9 }
10}
11
12impl Extensions {
13 pub fn from_ident(ident: &[u8]) -> Option<Extensions> {
15 match ident {
16 b"unwrap_newtypes" => Some(Extensions::UNWRAP_NEWTYPES),
17 b"implicit_some" => Some(Extensions::IMPLICIT_SOME),
18 b"unwrap_variant_newtypes" => Some(Extensions::UNWRAP_VARIANT_NEWTYPES),
19 _ => None,
20 }
21 }
22}
23
24impl Default for Extensions {
25 fn default() -> Self {
26 Extensions::empty()
27 }
28}
29
30#[cfg(test)]
31mod tests {
32 use super::Extensions;
33
34 fn roundtrip_extensions(ext: Extensions) {
35 let ron = crate::to_string(&ext).unwrap();
36 let ext2: Extensions = crate::from_str(&ron).unwrap();
37 assert_eq!(ext, ext2);
38 }
39
40 #[test]
41 fn test_extension_serde() {
42 roundtrip_extensions(Extensions::default());
43 roundtrip_extensions(Extensions::UNWRAP_NEWTYPES);
44 roundtrip_extensions(Extensions::IMPLICIT_SOME);
45 roundtrip_extensions(Extensions::UNWRAP_VARIANT_NEWTYPES);
46 roundtrip_extensions(Extensions::UNWRAP_NEWTYPES | Extensions::IMPLICIT_SOME);
47 roundtrip_extensions(Extensions::UNWRAP_NEWTYPES | Extensions::UNWRAP_VARIANT_NEWTYPES);
48 roundtrip_extensions(Extensions::IMPLICIT_SOME | Extensions::UNWRAP_VARIANT_NEWTYPES);
49 roundtrip_extensions(
50 Extensions::UNWRAP_NEWTYPES
51 | Extensions::IMPLICIT_SOME
52 | Extensions::UNWRAP_VARIANT_NEWTYPES,
53 );
54 }
55}