Skip to main content

mkit_server/indexed/
classify.rs

1//! Ticketed upload classification by its first four bytes.
2
3use crate::ServerError;
4
5/// The two indexed upload types.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum UploadType {
8    /// MKIT pack.
9    Pack,
10    /// MKPL packlist node.
11    Packlist,
12}
13
14/// Classify from the first four bytes, rejecting a shorter or unknown blob.
15pub fn classify(prefix: &[u8]) -> Result<UploadType, ServerError> {
16    match prefix.get(..4) {
17        Some(b"MKIT") => Ok(UploadType::Pack),
18        Some(b"MKPL") => Ok(UploadType::Packlist),
19        _ => Err(ServerError::invalid_argument("unknown upload type")),
20    }
21}
22
23#[cfg(test)]
24mod tests {
25    use super::*;
26    #[test]
27    fn exact_magic_and_short_input() {
28        assert_eq!(classify(b"MKITx").unwrap(), UploadType::Pack);
29        assert_eq!(classify(b"MKPLx").unwrap(), UploadType::Packlist);
30        for bytes in [b"MKI".as_slice(), b"", b"NOPE", b"mkit"] {
31            assert_eq!(
32                classify(bytes).unwrap_err().public_message(),
33                "unknown upload type"
34            );
35        }
36    }
37}