1use std::io::{Read, Write, Result};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub enum Signature {
9 IFO,
11
12 ARE,
14 GIT,
16 GIC,
18
19 UTC,
21 UTD,
23 UTE,
25 UTI,
27 UTP,
29 UTS,
31 UTM,
33 UTT,
35 UTW,
37
38 DLG,
40 JRL,
42 FAC,
44 ITP,
46
47 PTM,
49 PTT,
51
52 BIC,
54
55 Other([u8; 4]),
57}
58
59impl Signature {
60 #[inline]
62 pub fn read<R: Read>(reader: &mut R) -> Result<Self> {
63 let mut sig = [0u8; 4];
64 reader.read_exact(&mut sig)?;
65 Ok(sig.into())
66 }
67 #[inline]
69 pub fn write<W: Write>(&self, writer: &mut W) -> Result<()> {
70 writer.write_all(self.as_ref())
71 }
72}
73
74impl From<[u8; 4]> for Signature {
75 fn from(arr: [u8; 4]) -> Self {
76 use self::Signature::*;
77
78 match &arr {
79 b"IFO " => IFO,
80
81 b"ARE " => ARE,
82 b"GIT " => GIT,
83 b"GIC " => GIC,
84
85 b"UTC " => UTC,
86 b"UTD " => UTD,
87 b"UTE " => UTE,
88 b"UTI " => UTI,
89 b"UTP " => UTP,
90 b"UTS " => UTS,
91 b"UTM " => UTM,
92 b"UTT " => UTT,
93 b"UTW " => UTW,
94
95 b"DLG " => DLG,
96 b"JRL " => JRL,
97 b"FAC " => FAC,
98 b"ITP " => ITP,
99
100 b"PTM " => PTM,
101 b"PTT " => PTT,
102
103 b"BIC " => BIC,
104
105 _ => Other(arr),
106 }
107 }
108}
109
110impl AsRef<[u8]> for Signature {
111 fn as_ref(&self) -> &[u8] {
112 use self::Signature::*;
113
114 match *self {
115 IFO => b"IFO ",
116
117 ARE => b"ARE ",
118 GIT => b"GIT ",
119 GIC => b"GIC ",
120
121 UTC => b"UTC ",
122 UTD => b"UTD ",
123 UTE => b"UTE ",
124 UTI => b"UTI ",
125 UTP => b"UTP ",
126 UTS => b"UTS ",
127 UTM => b"UTM ",
128 UTT => b"UTT ",
129 UTW => b"UTW ",
130
131 DLG => b"DLG ",
132 JRL => b"JRL ",
133 FAC => b"FAC ",
134 ITP => b"ITP ",
135
136 PTM => b"PTM ",
137 PTT => b"PTT ",
138
139 BIC => b"BIC ",
140
141 Other(ref sig) => sig,
142 }
143 }
144}