From 7a0256cfb924e309c268ac81335065ff3134c67b Mon Sep 17 00:00:00 2001
From: Julien Cretin <cretin@google.com>
Date: Mon, 1 Jul 2024 17:40:48 +0200
Subject: [PATCH] Only use one content type per target label

---
 rust/cli/src/main.rs   |  107 ++--
 rust/gen/src/main.rs   |   71 ++-
 rust/lib/src/label.rs  | 1049 ++++++++++++++++++----------------------
 rust/lib/src/output.rs |   26 +-
 4 files changed, 562 insertions(+), 691 deletions(-)

diff --git a/rust/cli/src/main.rs b/rust/cli/src/main.rs
index d34e348b..cf9de5e5 100644
--- a/rust/cli/src/main.rs
+++ b/rust/cli/src/main.rs
@@ -12,6 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+use std::borrow::Cow;
 use std::fmt::Write;
 use std::path::{Path, PathBuf};
 use std::sync::Arc;
@@ -105,8 +106,7 @@ struct Format {
     ///
     ///   %p  The file path
     ///   %c  A short code describing the content type
-    ///   %d  A short description of the content type
-    ///   %D  A long description of the content type
+    ///   %d  The description of the content type
     ///   %g  The group of the content type
     ///   %m  The magic of the content type
     ///   %M  The MIME type of the content type
@@ -431,7 +431,7 @@ impl Response {
                 format.push_str(match () {
                     () if flags.modifiers.mime_type => "%M",
                     () if flags.modifiers.label => "%c",
-                    () => "%D (%g)",
+                    () => "%d (%g)",
                 });
                 format.push_str(if flags.modifiers.output_score { " %S" } else { "" });
                 format
@@ -443,12 +443,11 @@ impl Response {
                 Some('%') => match format.next() {
                     Some('p') => write!(&mut result, "{}", self.path.display())?,
                     Some('c') => write!(&mut result, "{}", self.code())?,
-                    Some('d') => write!(&mut result, "{}", self.short_desc()?)?,
-                    Some('D') => write!(&mut result, "{}", self.long_desc()?)?,
+                    Some('d') => write!(&mut result, "{}", self.desc()?)?,
                     Some('g') => write!(&mut result, "{}", self.group())?,
                     Some('m') => write!(&mut result, "{}", self.magic())?,
                     Some('M') => write!(&mut result, "{}", self.mime())?,
-                    Some('e') => write!(&mut result, "{}", self.extension())?,
+                    Some('e') => write!(&mut result, "{}", join(self.extension()))?,
                     Some('s') => write!(&mut result, "{:.2}", self.score())?,
                     Some('S') => write!(&mut result, "{}%", (100. * self.score()).trunc())?,
                     Some(c) => result.push(c),
@@ -469,10 +468,10 @@ impl Response {
         let output = JsonResult {
             ct_label: Some(self.code().to_string()),
             score: Some(self.score()),
-            group: Some(self.group()),
+            group: Some(self.group().to_string()),
             mime_type: Some(self.mime().to_string()),
             magic: Some(self.magic().to_string()),
-            description: Some(self.long_desc()?.to_string()),
+            description: Some(self.desc()?.to_string()),
         };
         let dl = if self.is_dl { output.clone() } else { JsonResult::default() };
         Ok(Json { path: self.path.to_path_buf(), dl, output })
@@ -489,68 +488,60 @@ impl Response {
         }
     }
 
-    fn short_desc(&self) -> Result<String> {
+    fn desc(&self) -> Result<Cow<str>> {
         Ok(match &self.output {
-            CliOutput::Empty => "Empty file".to_string(),
+            CliOutput::Empty => "Empty file".into(),
             CliOutput::Symlink => {
-                format!("Symbolic link to {}", std::fs::read_link(&self.path)?.display())
+                format!("Symbolic link to {}", std::fs::read_link(&self.path)?.display()).into()
             }
-            CliOutput::Directory => "A directory".to_string(),
-            CliOutput::Error(e) => e.clone(),
-            CliOutput::Label(x) => join(x.short_desc()),
-            CliOutput::Output(x) => join(x.label().short_desc()),
+            CliOutput::Directory => "A directory".into(),
+            CliOutput::Error(e) => e.into(),
+            CliOutput::Label(x) => x.desc().into(),
+            CliOutput::Output(x) => x.label().desc().into(),
         })
     }
 
-    fn long_desc(&self) -> Result<String> {
-        Ok(match &self.output {
-            CliOutput::Label(x) => join(x.long_desc()),
-            CliOutput::Output(x) => join(x.label().long_desc()),
-            _ => return self.short_desc(),
-        })
-    }
-
-    fn group(&self) -> String {
+    fn group(&self) -> &str {
         match &self.output {
-            CliOutput::Empty => "inode".to_string(),
-            CliOutput::Symlink => "inode".to_string(),
-            CliOutput::Directory => "inode".to_string(),
-            CliOutput::Error(_) => "error".to_string(),
-            CliOutput::Label(x) => join(x.group()),
-            CliOutput::Output(x) => join(x.label().group()),
+            CliOutput::Empty => "inode",
+            CliOutput::Symlink => "inode",
+            CliOutput::Directory => "inode",
+            CliOutput::Error(_) => "error",
+            CliOutput::Label(x) => x.group(),
+            CliOutput::Output(x) => x.label().group(),
         }
     }
 
-    fn magic(&self) -> String {
+    fn magic(&self) -> Cow<str> {
         match &self.output {
-            CliOutput::Empty => self.code().to_string(),
-            CliOutput::Symlink => format!("symlink link to {}", self.path.display()),
-            CliOutput::Directory => self.code().to_string(),
-            CliOutput::Error(_) => self.code().to_string(),
-            CliOutput::Label(x) => join(x.magic()),
-            CliOutput::Output(x) => join(x.label().magic()),
+            CliOutput::Empty => self.code().into(),
+            CliOutput::Symlink => format!("symlink link to {}", self.path.display()).into(),
+            CliOutput::Directory => self.code().into(),
+            CliOutput::Error(_) => self.code().into(),
+            CliOutput::Label(x) => x.magic().into(),
+            CliOutput::Output(x) => x.label().magic().into(),
         }
     }
 
-    fn mime(&self) -> String {
+    fn mime(&self) -> &str {
         match &self.output {
-            CliOutput::Empty => "inode/x-empty".to_string(),
-            CliOutput::Symlink => "inode/symlink".to_string(),
-            CliOutput::Directory => "inode/directory".to_string(),
-            CliOutput::Error(_) => "error".to_string(),
-            CliOutput::Label(x) => join(x.mime()),
-            CliOutput::Output(x) => join(x.label().mime()),
+            CliOutput::Empty => "inode/x-empty",
+            CliOutput::Symlink => "inode/symlink",
+            CliOutput::Directory => "inode/directory",
+            CliOutput::Error(_) => "error",
+            CliOutput::Label(x) => x.mime(),
+            CliOutput::Output(x) => x.label().mime(),
         }
     }
 
-    fn extension(&self) -> String {
+    fn extension(&self) -> &[&str] {
         match &self.output {
-            CliOutput::Empty => String::new(),
-            CliOutput::Symlink => String::new(),
-            CliOutput::Directory => String::new(),
-            CliOutput::Error(_) => String::new(),
-            CliOutput::Label(x) => join(x.extension()),
-            CliOutput::Output(x) => join(x.label().extension()),
+            CliOutput::Empty => &[],
+            CliOutput::Symlink => &[],
+            CliOutput::Directory => &[],
+            CliOutput::Error(_) => &[],
+            CliOutput::Label(x) => x.extension(),
+            CliOutput::Output(x) => x.label().extension(),
         }
     }
 
@@ -566,13 +557,13 @@ impl Response {
     }
 
     fn color(&self) -> Option<Color> {
-        let groups = match &self.output {
+        let group = match &self.output {
             CliOutput::Error(_) => return Some(Color::Red),
-            CliOutput::Label(x) => x.group(),
-            CliOutput::Output(x) => x.label().group(),
-            _ => &[],
+            CliOutput::Label(x) => Some(x.group()),
+            CliOutput::Output(x) => Some(x.label().group()),
+            _ => None,
         };
-        groups.iter().find_map(|x| group_color(x))
+        group.iter().find_map(|x| group_color(x))
     }
 }
 
@@ -591,12 +582,14 @@ fn group_color(group: &str) -> Option<Color> {
 
 fn join<T: AsRef<str>>(xs: impl IntoIterator<Item = T>) -> String {
     let mut result = String::new();
+    result.push('[');
     for (i, x) in xs.into_iter().enumerate() {
         if i != 0 {
-            result.push_str(" | ");
+            result.push('|');
         }
         result.push_str(x.as_ref());
     }
+    result.push(']');
     result
 }
 
diff --git a/rust/gen/src/main.rs b/rust/gen/src/main.rs
index 6dfeaf3d..b6bcaf2a 100644
--- a/rust/gen/src/main.rs
+++ b/rust/gen/src/main.rs
@@ -12,7 +12,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-use std::collections::{BTreeMap, BTreeSet};
+use std::collections::BTreeMap;
 use std::fs::File;
 use std::io::Write;
 
@@ -22,28 +22,36 @@ use serde::Deserialize;
 fn main() -> Result<()> {
     let configs: BTreeMap<String, Config> =
         serde_json::from_reader(File::open("data/config.json")?)?;
-    let mut labels = BTreeMap::<String, Vec<Label>>::new();
-    for (short, config) in configs {
+    let mut labels = BTreeMap::<String, Option<Label>>::new();
+    for (key, config) in configs {
         if !config.in_scope_for_output_content_type {
             continue;
         }
-        if ["directory", "empty", "symlink"].contains(&short.as_str()) {
+        if ["directory", "empty", "symlink"].contains(&key.as_str()) {
             continue;
         }
-        let target = match config.target_label {
-            Some(x) => x,
-            None => continue,
-        };
+        let target = config.target_label.unwrap_or_else(|| key.clone());
+        let is_target = target == key;
+        let entry = labels.entry(target).or_default();
+        if !is_target {
+            continue;
+        }
+        assert!(entry.is_none());
         let exts = config.extensions;
-        let mime = unwrap(config.mime_type, "mime_type", &short)?;
-        let group = unwrap(config.group, "group", &short)?;
-        let magic = unwrap(config.magic, "magic", &short)?;
-        let long = unwrap(config.description, "description", &short)?;
+        let mime = unwrap(config.mime_type, "mime_type", &key)?;
+        let group = unwrap(config.group, "group", &key)?;
+        let magic = unwrap(config.magic, "magic", &key)?;
+        let desc = unwrap(config.description, "description", &key)?;
         let text = config.tags.iter().any(|x| *x == "text");
-        let label = Label { short, long, magic, group, mime, exts, text };
-        labels.entry(target).or_default().push(label);
+        *entry = Some(Label { desc, magic, group, mime, exts, text });
     }
-    let labels = labels;
+    let labels = labels
+        .into_iter()
+        .map(|(target, label)| {
+            let label = label.with_context(|| format!("missing label for {target}"))?;
+            Ok((target, label))
+        })
+        .collect::<Result<BTreeMap<_, _>>>()?;
     let mut output = File::create("../lib/src/label.rs")?;
     let header = std::fs::read_to_string(file!())?;
     let header = header.split("\n\n").next().context("main.rs does not contain an empty line")?;
@@ -54,24 +62,23 @@ fn main() -> Result<()> {
     writeln!(output, "/// Content type of a file.")?;
     writeln!(output, "#[derive(Debug, Copy, Clone, PartialEq, Eq)]\n#[repr(u32)]")?;
     writeln!(output, "pub enum Label {{")?;
-    for (target, labels) in &labels {
-        let doc = merge_ref(labels, |x| &x.long).join(" | ");
-        writeln!(output, "    /// {doc}")?;
+    for (target, Label { desc, .. }) in &labels {
+        writeln!(output, "    /// {desc}")?;
         writeln!(output, "    {},", capitalize(target))?;
     }
     writeln!(output, "}}\n")?;
     writeln!(output, "pub(crate) const MAX_LABEL: u32 = {};\n", labels.len() - 1)?;
     writeln!(output, "pub(crate) const METADATA: [Metadata; {}] = [", labels.len())?;
-    for (target, labels) in &labels {
+    for (target, label) in &labels {
+        let Label { desc, magic, group, mime, exts, text } = label;
         writeln!(output, "    Metadata {{")?;
         writeln!(output, "        code: {target:?},")?;
-        writeln!(output, "        short_desc: &{:?},", merge_ref(labels, |x| &x.short))?;
-        writeln!(output, "        long_desc: &{:?},", merge_ref(labels, |x| &x.long))?;
-        writeln!(output, "        magic: &{:?},", merge_ref(labels, |x| &x.magic))?;
-        writeln!(output, "        group: &{:?},", merge_ref(labels, |x| &x.group))?;
-        writeln!(output, "        mime: &{:?},", merge_ref(labels, |x| &x.mime))?;
-        writeln!(output, "        extension: &{:?},", merge(labels, |x| &x.exts))?;
-        writeln!(output, "        is_text: {:?},", labels.iter().all(|x| x.text))?;
+        writeln!(output, "        desc: {desc:?},")?;
+        writeln!(output, "        magic: {magic:?},")?;
+        writeln!(output, "        group: {group:?},")?;
+        writeln!(output, "        mime: {mime:?},")?;
+        writeln!(output, "        extension: &{exts:?},")?;
+        writeln!(output, "        is_text: {text:?},")?;
         writeln!(output, "    }},")?;
     }
     writeln!(output, "];")?;
@@ -92,8 +99,7 @@ struct Config {
 
 #[derive(Debug)]
 struct Label {
-    short: String,
-    long: String,
+    desc: String,
     magic: String,
     group: String,
     mime: String,
@@ -105,15 +111,6 @@ fn unwrap<T>(x: Option<T>, f: &str, n: &str) -> Result<T> {
     x.ok_or_else(|| anyhow!("missing {f} for {n:?}"))
 }
 
-fn merge_ref<T: Ord + AsRef<str>>(labels: &[Label], field: impl Fn(&Label) -> &T) -> Vec<String> {
-    merge(labels, |x| std::slice::from_ref(field(x)))
-}
-
-fn merge<T: Ord + AsRef<str>>(labels: &[Label], field: impl Fn(&Label) -> &[T]) -> Vec<String> {
-    let labels: BTreeSet<&T> = labels.iter().flat_map(field).collect();
-    labels.into_iter().map(|x| x.as_ref().to_string()).collect()
-}
-
 fn capitalize(xs: &str) -> String {
     let mut xs = xs.as_bytes().to_vec();
     xs[0] = xs[0].to_ascii_uppercase();
diff --git a/rust/lib/src/label.rs b/rust/lib/src/label.rs
index b1bc85ec..97445d78 100644
--- a/rust/lib/src/label.rs
+++ b/rust/lib/src/label.rs
@@ -147,7 +147,7 @@ pub enum Label {
     Pcap,
     /// PDF document
     Pdf,
-    /// ELF executable | PE Windows executable
+    /// PE executable
     Pebin,
     /// PEM certificate
     Pem,
@@ -254,1131 +254,1018 @@ pub(crate) const MAX_LABEL: u32 = 112;
 pub(crate) const METADATA: [Metadata; 113] = [
     Metadata {
         code: "ai",
-        short_desc: &["ai"],
-        long_desc: &["Adobe Illustrator Artwork"],
-        magic: &["PDF document"],
-        group: &["document"],
-        mime: &["application/pdf"],
+        desc: "Adobe Illustrator Artwork",
+        magic: "PDF document",
+        group: "document",
+        mime: "application/pdf",
         extension: &["ai"],
         is_text: false,
     },
     Metadata {
         code: "apk",
-        short_desc: &["apk"],
-        long_desc: &["Android package"],
-        magic: &["Java archive data"],
-        group: &["executable"],
-        mime: &["application/vnd.android.package-archive"],
+        desc: "Android package",
+        magic: "Java archive data",
+        group: "executable",
+        mime: "application/vnd.android.package-archive",
         extension: &["apk"],
         is_text: false,
     },
     Metadata {
         code: "appleplist",
-        short_desc: &["appleplist"],
-        long_desc: &["Apple property list"],
-        magic: &["Apple binary property list"],
-        group: &["application"],
-        mime: &["application/x-plist"],
+        desc: "Apple property list",
+        magic: "Apple binary property list",
+        group: "application",
+        mime: "application/x-plist",
         extension: &["bplist", "plist"],
         is_text: true,
     },
     Metadata {
         code: "asm",
-        short_desc: &["asm"],
-        long_desc: &["Assembly"],
-        magic: &["assembler source"],
-        group: &["code"],
-        mime: &["text/x-asm"],
+        desc: "Assembly",
+        magic: "assembler source",
+        group: "code",
+        mime: "text/x-asm",
         extension: &["S", "asm"],
         is_text: true,
     },
     Metadata {
         code: "asp",
-        short_desc: &["asp"],
-        long_desc: &["ASP source"],
-        magic: &["HTML document"],
-        group: &["code"],
-        mime: &["text/html"],
-        extension: &["asp", "aspx"],
+        desc: "ASP source",
+        magic: "HTML document",
+        group: "code",
+        mime: "text/html",
+        extension: &["aspx", "asp"],
         is_text: true,
     },
     Metadata {
         code: "batch",
-        short_desc: &["batch"],
-        long_desc: &["DOS batch file"],
-        magic: &["DOS batch file"],
-        group: &["code"],
-        mime: &["text/x-msdos-batch"],
+        desc: "DOS batch file",
+        magic: "DOS batch file",
+        group: "code",
+        mime: "text/x-msdos-batch",
         extension: &["bat"],
         is_text: true,
     },
     Metadata {
         code: "bmp",
-        short_desc: &["bmp"],
-        long_desc: &["BMP image data"],
-        magic: &["PC bitmap"],
-        group: &["image"],
-        mime: &["image/bmp"],
+        desc: "BMP image data",
+        magic: "PC bitmap",
+        group: "image",
+        mime: "image/bmp",
         extension: &["bmp"],
         is_text: false,
     },
     Metadata {
         code: "bzip",
-        short_desc: &["bzip"],
-        long_desc: &["bzip2 compressed data"],
-        magic: &["bzip2 compressed data"],
-        group: &["archive"],
-        mime: &["application/x-bzip2"],
-        extension: &["bz2", "tar.bz2", "tbz2"],
+        desc: "bzip2 compressed data",
+        magic: "bzip2 compressed data",
+        group: "archive",
+        mime: "application/x-bzip2",
+        extension: &["bz2", "tbz2", "tar.bz2"],
         is_text: false,
     },
     Metadata {
         code: "c",
-        short_desc: &["c"],
-        long_desc: &["C source"],
-        magic: &["C source"],
-        group: &["code"],
-        mime: &["text/x-c"],
-        extension: &["c", "cc", "cpp", "h", "hpp"],
+        desc: "C source",
+        magic: "C source",
+        group: "code",
+        mime: "text/x-c",
+        extension: &["c", "cpp", "h", "hpp", "cc"],
         is_text: true,
     },
     Metadata {
         code: "cab",
-        short_desc: &["cab"],
-        long_desc: &["Microsoft Cabinet archive data"],
-        magic: &["Microsoft Cabinet archive data"],
-        group: &["archive"],
-        mime: &["application/vnd.ms-cab-compressed"],
+        desc: "Microsoft Cabinet archive data",
+        magic: "Microsoft Cabinet archive data",
+        group: "archive",
+        mime: "application/vnd.ms-cab-compressed",
         extension: &["cab"],
         is_text: false,
     },
     Metadata {
         code: "cat",
-        short_desc: &["cat"],
-        long_desc: &["Windows Catalog file"],
-        magic: &["data"],
-        group: &["application"],
-        mime: &["application/octet-stream"],
+        desc: "Windows Catalog file",
+        magic: "data",
+        group: "application",
+        mime: "application/octet-stream",
         extension: &["cat"],
         is_text: false,
     },
     Metadata {
         code: "chm",
-        short_desc: &["chm"],
-        long_desc: &["MS Windows HtmlHelp Data"],
-        magic: &["MS Windows HtmlHelp Data"],
-        group: &["application"],
-        mime: &["application/chm"],
+        desc: "MS Windows HtmlHelp Data",
+        magic: "MS Windows HtmlHelp Data",
+        group: "application",
+        mime: "application/chm",
         extension: &["chm"],
         is_text: false,
     },
     Metadata {
         code: "coff",
-        short_desc: &["coff"],
-        long_desc: &["Intel 80386 COFF"],
-        magic: &["Intel 80386 COFF"],
-        group: &["executable"],
-        mime: &["application/x-coff"],
+        desc: "Intel 80386 COFF",
+        magic: "Intel 80386 COFF",
+        group: "executable",
+        mime: "application/x-coff",
         extension: &[],
         is_text: false,
     },
     Metadata {
         code: "crx",
-        short_desc: &["crx"],
-        long_desc: &["Google Chrome extension"],
-        magic: &["Google Chrome extension"],
-        group: &["executable"],
-        mime: &["application/x-chrome-extension"],
+        desc: "Google Chrome extension",
+        magic: "Google Chrome extension",
+        group: "executable",
+        mime: "application/x-chrome-extension",
         extension: &["crx"],
         is_text: false,
     },
     Metadata {
         code: "cs",
-        short_desc: &["cs"],
-        long_desc: &["C# source"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["text/plain"],
+        desc: "C# source",
+        magic: "ASCII text",
+        group: "code",
+        mime: "text/plain",
         extension: &["cs"],
         is_text: true,
     },
     Metadata {
         code: "css",
-        short_desc: &["css"],
-        long_desc: &["CSS source"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["text/css"],
+        desc: "CSS source",
+        magic: "ASCII text",
+        group: "code",
+        mime: "text/css",
         extension: &["css"],
         is_text: true,
     },
     Metadata {
         code: "csv",
-        short_desc: &["csv"],
-        long_desc: &["CSV document"],
-        magic: &["CSV text"],
-        group: &["code"],
-        mime: &["text/csv"],
+        desc: "CSV document",
+        magic: "CSV text",
+        group: "code",
+        mime: "text/csv",
         extension: &["csv"],
         is_text: true,
     },
     Metadata {
         code: "deb",
-        short_desc: &["deb"],
-        long_desc: &["Debian binary package"],
-        magic: &["Debian binary package"],
-        group: &["archive"],
-        mime: &["application/vnd.debian.binary-package"],
+        desc: "Debian binary package",
+        magic: "Debian binary package",
+        group: "archive",
+        mime: "application/vnd.debian.binary-package",
         extension: &["deb"],
         is_text: false,
     },
     Metadata {
         code: "dex",
-        short_desc: &["dex"],
-        long_desc: &["Dalvik dex file"],
-        magic: &["Dalvik dex file"],
-        group: &["executable"],
-        mime: &["application/x-android-dex"],
+        desc: "Dalvik dex file",
+        magic: "Dalvik dex file",
+        group: "executable",
+        mime: "application/x-android-dex",
         extension: &["dex"],
         is_text: false,
     },
     Metadata {
         code: "dmg",
-        short_desc: &["dmg"],
-        long_desc: &["Apple disk image"],
-        magic: &["Apple disk image"],
-        group: &["archive"],
-        mime: &["application/x-apple-diskimage"],
+        desc: "Apple disk image",
+        magic: "Apple disk image",
+        group: "archive",
+        mime: "application/x-apple-diskimage",
         extension: &["dmg"],
         is_text: false,
     },
     Metadata {
         code: "doc",
-        short_desc: &["doc"],
-        long_desc: &["Microsoft Word CDF document"],
-        magic: &["Composite Document File"],
-        group: &["document"],
-        mime: &["application/msword"],
+        desc: "Microsoft Word CDF document",
+        magic: "Composite Document File",
+        group: "document",
+        mime: "application/msword",
         extension: &["doc"],
         is_text: false,
     },
     Metadata {
         code: "docx",
-        short_desc: &["docx"],
-        long_desc: &["Microsoft Word 2007+ document"],
-        magic: &["Microsoft Word 2007+"],
-        group: &["document"],
-        mime: &["application/vnd.openxmlformats-officedocument.wordprocessingml.document"],
-        extension: &["docm", "docx"],
+        desc: "Microsoft Word 2007+ document",
+        magic: "Microsoft Word 2007+",
+        group: "document",
+        mime: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+        extension: &["docx", "docm"],
         is_text: false,
     },
     Metadata {
         code: "elf",
-        short_desc: &["elf", "ko", "so"],
-        long_desc: &["ELF executable"],
-        magic: &["ELF executable"],
-        group: &["executable"],
-        mime: &["application/x-executable-elf"],
-        extension: &["elf", "ko", "so"],
+        desc: "ELF executable",
+        magic: "ELF executable",
+        group: "executable",
+        mime: "application/x-executable-elf",
+        extension: &["elf", "so"],
         is_text: false,
     },
     Metadata {
         code: "emf",
-        short_desc: &["emf"],
-        long_desc: &["Windows Enhanced Metafile image data"],
-        magic: &["Windows Enhanced Metafile"],
-        group: &["application"],
-        mime: &["application/octet-stream"],
+        desc: "Windows Enhanced Metafile image data",
+        magic: "Windows Enhanced Metafile",
+        group: "application",
+        mime: "application/octet-stream",
         extension: &["emf"],
         is_text: false,
     },
     Metadata {
         code: "eml",
-        short_desc: &["eml"],
-        long_desc: &["RFC 822 mail"],
-        magic: &["RFC 822 mail"],
-        group: &["text"],
-        mime: &["message/rfc822"],
+        desc: "RFC 822 mail",
+        magic: "RFC 822 mail",
+        group: "text",
+        mime: "message/rfc822",
         extension: &["eml"],
         is_text: true,
     },
     Metadata {
         code: "epub",
-        short_desc: &["epub"],
-        long_desc: &["EPUB document"],
-        magic: &["EPUB document"],
-        group: &["document"],
-        mime: &["application/epub+zip"],
+        desc: "EPUB document",
+        magic: "EPUB document",
+        group: "document",
+        mime: "application/epub+zip",
         extension: &["epub"],
         is_text: false,
     },
     Metadata {
         code: "flac",
-        short_desc: &["flac"],
-        long_desc: &["FLAC audio bitstream data"],
-        magic: &["FLAC audio bitstream data"],
-        group: &["audio"],
-        mime: &["audio/flac"],
+        desc: "FLAC audio bitstream data",
+        magic: "FLAC audio bitstream data",
+        group: "audio",
+        mime: "audio/flac",
         extension: &["flac"],
         is_text: false,
     },
     Metadata {
         code: "gif",
-        short_desc: &["gif"],
-        long_desc: &["GIF image data"],
-        magic: &["GIF image data"],
-        group: &["image"],
-        mime: &["image/gif"],
+        desc: "GIF image data",
+        magic: "GIF image data",
+        group: "image",
+        mime: "image/gif",
         extension: &["gif"],
         is_text: false,
     },
     Metadata {
         code: "go",
-        short_desc: &["go"],
-        long_desc: &["Golang source"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["text/x-golang"],
+        desc: "Golang source",
+        magic: "ASCII text",
+        group: "code",
+        mime: "text/x-golang",
         extension: &["go"],
         is_text: true,
     },
     Metadata {
         code: "gzip",
-        short_desc: &["gzip"],
-        long_desc: &["gzip compressed data"],
-        magic: &["gzip compressed data"],
-        group: &["archive"],
-        mime: &["application/gzip"],
-        extension: &["gz", "gzip", "tar.gz", "tgz"],
+        desc: "gzip compressed data",
+        magic: "gzip compressed data",
+        group: "archive",
+        mime: "application/gzip",
+        extension: &["gz", "gzip", "tgz", "tar.gz"],
         is_text: false,
     },
     Metadata {
         code: "hlp",
-        short_desc: &["hlp"],
-        long_desc: &["MS Windows help"],
-        magic: &["MS Windows help"],
-        group: &["application"],
-        mime: &["application/winhlp"],
+        desc: "MS Windows help",
+        magic: "MS Windows help",
+        group: "application",
+        mime: "application/winhlp",
         extension: &["hlp"],
         is_text: false,
     },
     Metadata {
         code: "html",
-        short_desc: &["html"],
-        long_desc: &["HTML document"],
-        magic: &["HTML document"],
-        group: &["code"],
-        mime: &["text/html"],
-        extension: &["htm", "html", "xht", "xhtml"],
+        desc: "HTML document",
+        magic: "HTML document",
+        group: "code",
+        mime: "text/html",
+        extension: &["html", "htm", "xhtml", "xht"],
         is_text: true,
     },
     Metadata {
         code: "ico",
-        short_desc: &["ico"],
-        long_desc: &["MS Windows icon resource"],
-        magic: &["MS Windows icon resource"],
-        group: &["image"],
-        mime: &["image/vnd.microsoft.icon"],
+        desc: "MS Windows icon resource",
+        magic: "MS Windows icon resource",
+        group: "image",
+        mime: "image/vnd.microsoft.icon",
         extension: &["ico"],
         is_text: false,
     },
     Metadata {
         code: "ini",
-        short_desc: &["ini"],
-        long_desc: &["INI configuration file"],
-        magic: &["Generic INItialization configuration"],
-        group: &["text"],
-        mime: &["text/plain"],
+        desc: "INI configuration file",
+        magic: "Generic INItialization configuration",
+        group: "text",
+        mime: "text/plain",
         extension: &["ini"],
         is_text: true,
     },
     Metadata {
         code: "internetshortcut",
-        short_desc: &["internetshortcut"],
-        long_desc: &["MS Windows Internet shortcut"],
-        magic: &["MS Windows 95 Internet shortcut"],
-        group: &["application"],
-        mime: &["application/x-mswinurl"],
+        desc: "MS Windows Internet shortcut",
+        magic: "MS Windows 95 Internet shortcut",
+        group: "application",
+        mime: "application/x-mswinurl",
         extension: &["url"],
         is_text: true,
     },
     Metadata {
         code: "iso",
-        short_desc: &["iso"],
-        long_desc: &["ISO 9660 CD-ROM filesystem data"],
-        magic: &["ISO 9660 CD-ROM filesystem data"],
-        group: &["archive"],
-        mime: &["application/x-iso9660-image"],
+        desc: "ISO 9660 CD-ROM filesystem data",
+        magic: "ISO 9660 CD-ROM filesystem data",
+        group: "archive",
+        mime: "application/x-iso9660-image",
         extension: &["iso"],
         is_text: false,
     },
     Metadata {
         code: "jar",
-        short_desc: &["jar"],
-        long_desc: &["Java archive data (JAR)"],
-        magic: &["Java archive data (JAR)"],
-        group: &["archive"],
-        mime: &["application/java-archive"],
+        desc: "Java archive data (JAR)",
+        magic: "Java archive data (JAR)",
+        group: "archive",
+        mime: "application/java-archive",
         extension: &["jar"],
         is_text: false,
     },
     Metadata {
         code: "java",
-        short_desc: &["java"],
-        long_desc: &["Java source"],
-        magic: &["Java source"],
-        group: &["code"],
-        mime: &["text/x-java"],
+        desc: "Java source",
+        magic: "Java source",
+        group: "code",
+        mime: "text/x-java",
         extension: &["java"],
         is_text: true,
     },
     Metadata {
         code: "javabytecode",
-        short_desc: &["javabytecode"],
-        long_desc: &["Java compiled bytecode"],
-        magic: &["compiled Java class data"],
-        group: &["executable"],
-        mime: &["application/x-java-applet"],
+        desc: "Java compiled bytecode",
+        magic: "compiled Java class data",
+        group: "executable",
+        mime: "application/x-java-applet",
         extension: &["class"],
         is_text: false,
     },
     Metadata {
         code: "javascript",
-        short_desc: &["javascript"],
-        long_desc: &["JavaScript source"],
-        magic: &["JavaScript source"],
-        group: &["code"],
-        mime: &["application/javascript"],
+        desc: "JavaScript source",
+        magic: "JavaScript source",
+        group: "code",
+        mime: "application/javascript",
         extension: &["js"],
         is_text: true,
     },
     Metadata {
         code: "jpeg",
-        short_desc: &["jpeg"],
-        long_desc: &["JPEG image data"],
-        magic: &["JPEG image data"],
-        group: &["image"],
-        mime: &["image/jpeg"],
-        extension: &["jpeg", "jpg"],
+        desc: "JPEG image data",
+        magic: "JPEG image data",
+        group: "image",
+        mime: "image/jpeg",
+        extension: &["jpg", "jpeg"],
         is_text: false,
     },
     Metadata {
         code: "json",
-        short_desc: &["json"],
-        long_desc: &["JSON document"],
-        magic: &["JSON data"],
-        group: &["code"],
-        mime: &["application/json"],
+        desc: "JSON document",
+        magic: "JSON data",
+        group: "code",
+        mime: "application/json",
         extension: &["json"],
         is_text: true,
     },
     Metadata {
         code: "latex",
-        short_desc: &["latex"],
-        long_desc: &["LaTeX document"],
-        magic: &["LaTeX document"],
-        group: &["text"],
-        mime: &["text/x-tex"],
+        desc: "LaTeX document",
+        magic: "LaTeX document",
+        group: "text",
+        mime: "text/x-tex",
         extension: &["tex"],
         is_text: true,
     },
     Metadata {
         code: "lisp",
-        short_desc: &["lisp"],
-        long_desc: &["Lisp source"],
-        magic: &["Lisp/Scheme program"],
-        group: &["code"],
-        mime: &["text/x-lisp"],
+        desc: "Lisp source",
+        magic: "Lisp/Scheme program",
+        group: "code",
+        mime: "text/x-lisp",
         extension: &["lisp"],
         is_text: true,
     },
     Metadata {
         code: "lnk",
-        short_desc: &["lnk"],
-        long_desc: &["MS Windows shortcut"],
-        magic: &["MS Windows shortcut"],
-        group: &["application"],
-        mime: &["application/x-ms-shortcut"],
+        desc: "MS Windows shortcut",
+        magic: "MS Windows shortcut",
+        group: "application",
+        mime: "application/x-ms-shortcut",
         extension: &["lnk"],
         is_text: false,
     },
     Metadata {
         code: "m3u",
-        short_desc: &["m3u"],
-        long_desc: &["M3U playlist"],
-        magic: &["M3U playlist"],
-        group: &["application"],
-        mime: &["text/plain"],
-        extension: &["m3u", "m3u8"],
+        desc: "M3U playlist",
+        magic: "M3U playlist",
+        group: "application",
+        mime: "text/plain",
+        extension: &["m3u8", "m3u"],
         is_text: false,
     },
     Metadata {
         code: "macho",
-        short_desc: &["dylib", "macho"],
-        long_desc: &["Mach-O executable"],
-        magic: &["Mach-O executable"],
-        group: &["executable"],
-        mime: &["application/x-mach-o"],
-        extension: &["dylib"],
+        desc: "Mach-O executable",
+        magic: "Mach-O executable",
+        group: "executable",
+        mime: "application/x-mach-o",
+        extension: &[],
         is_text: false,
     },
     Metadata {
         code: "makefile",
-        short_desc: &["makefile"],
-        long_desc: &["Makefile source"],
-        magic: &["makefile script"],
-        group: &["code"],
-        mime: &["text/x-makefile"],
+        desc: "Makefile source",
+        magic: "makefile script",
+        group: "code",
+        mime: "text/x-makefile",
         extension: &["=Makefile"],
         is_text: true,
     },
     Metadata {
         code: "markdown",
-        short_desc: &["markdown"],
-        long_desc: &["Markdown document"],
-        magic: &["ASCII text"],
-        group: &["text"],
-        mime: &["text/markdown"],
+        desc: "Markdown document",
+        magic: "ASCII text",
+        group: "text",
+        mime: "text/markdown",
         extension: &["md"],
         is_text: true,
     },
     Metadata {
         code: "mht",
-        short_desc: &["mht"],
-        long_desc: &["MHTML document"],
-        magic: &["HTML document"],
-        group: &["code"],
-        mime: &["application/x-mimearchive"],
+        desc: "MHTML document",
+        magic: "HTML document",
+        group: "code",
+        mime: "application/x-mimearchive",
         extension: &["mht"],
         is_text: true,
     },
     Metadata {
         code: "mp3",
-        short_desc: &["mp3"],
-        long_desc: &["MP3 media file"],
-        magic: &["Audio file with ID3"],
-        group: &["audio"],
-        mime: &["audio/mpeg"],
+        desc: "MP3 media file",
+        magic: "Audio file with ID3",
+        group: "audio",
+        mime: "audio/mpeg",
         extension: &["mp3"],
         is_text: false,
     },
     Metadata {
         code: "mp4",
-        short_desc: &["mp4"],
-        long_desc: &["MP4 media file"],
-        magic: &["ISO Media"],
-        group: &["video"],
-        mime: &["video/mp4"],
+        desc: "MP4 media file",
+        magic: "ISO Media",
+        group: "video",
+        mime: "video/mp4",
         extension: &["mov", "mp4"],
         is_text: false,
     },
     Metadata {
         code: "mscompress",
-        short_desc: &["mscompress"],
-        long_desc: &["MS Compress archive data"],
-        magic: &["MS Compress archive data"],
-        group: &["archive"],
-        mime: &["application/x-ms-compress-szdd"],
+        desc: "MS Compress archive data",
+        magic: "MS Compress archive data",
+        group: "archive",
+        mime: "application/x-ms-compress-szdd",
         extension: &[],
         is_text: false,
     },
     Metadata {
         code: "msi",
-        short_desc: &["msi"],
-        long_desc: &["Microsoft Installer file"],
-        magic: &["Composite Document File"],
-        group: &["archive"],
-        mime: &["application/x-msi"],
+        desc: "Microsoft Installer file",
+        magic: "Composite Document File",
+        group: "archive",
+        mime: "application/x-msi",
         extension: &["msi"],
         is_text: false,
     },
     Metadata {
         code: "mum",
-        short_desc: &["mum"],
-        long_desc: &["Windows Update Package file"],
-        magic: &["XML document"],
-        group: &["application"],
-        mime: &["text/xml"],
+        desc: "Windows Update Package file",
+        magic: "XML document",
+        group: "application",
+        mime: "text/xml",
         extension: &["mum"],
         is_text: true,
     },
     Metadata {
         code: "odex",
-        short_desc: &["odex"],
-        long_desc: &["ODEX ELF executable"],
-        magic: &["ELF executable"],
-        group: &["executable"],
-        mime: &["application/x-executable-elf"],
+        desc: "ODEX ELF executable",
+        magic: "ELF executable",
+        group: "executable",
+        mime: "application/x-executable-elf",
         extension: &["odex"],
         is_text: false,
     },
     Metadata {
         code: "odp",
-        short_desc: &["odp"],
-        long_desc: &["OpenDocument Presentation"],
-        magic: &["OpenDocument Presentation"],
-        group: &["document"],
-        mime: &["application/vnd.oasis.opendocument.presentation"],
+        desc: "OpenDocument Presentation",
+        magic: "OpenDocument Presentation",
+        group: "document",
+        mime: "application/vnd.oasis.opendocument.presentation",
         extension: &["odp"],
         is_text: false,
     },
     Metadata {
         code: "ods",
-        short_desc: &["ods"],
-        long_desc: &["OpenDocument Spreadsheet"],
-        magic: &["OpenDocument Spreadsheet"],
-        group: &["document"],
-        mime: &["application/vnd.oasis.opendocument.spreadsheet"],
+        desc: "OpenDocument Spreadsheet",
+        magic: "OpenDocument Spreadsheet",
+        group: "document",
+        mime: "application/vnd.oasis.opendocument.spreadsheet",
         extension: &["ods"],
         is_text: false,
     },
     Metadata {
         code: "odt",
-        short_desc: &["odt"],
-        long_desc: &["OpenDocument Text"],
-        magic: &["OpenDocument Text"],
-        group: &["document"],
-        mime: &["application/vnd.oasis.opendocument.text"],
+        desc: "OpenDocument Text",
+        magic: "OpenDocument Text",
+        group: "document",
+        mime: "application/vnd.oasis.opendocument.text",
         extension: &["odt"],
         is_text: false,
     },
     Metadata {
         code: "ogg",
-        short_desc: &["ogg"],
-        long_desc: &["Ogg data"],
-        magic: &["Ogg data"],
-        group: &["audio"],
-        mime: &["audio/ogg"],
+        desc: "Ogg data",
+        magic: "Ogg data",
+        group: "audio",
+        mime: "audio/ogg",
         extension: &["ogg"],
         is_text: false,
     },
     Metadata {
         code: "outlook",
-        short_desc: &["outlook"],
-        long_desc: &["MS Outlook Message"],
-        magic: &["CDFV2 Microsoft Outlook Message"],
-        group: &["application"],
-        mime: &["application/vnd.ms-outlook"],
+        desc: "MS Outlook Message",
+        magic: "CDFV2 Microsoft Outlook Message",
+        group: "application",
+        mime: "application/vnd.ms-outlook",
         extension: &[],
         is_text: false,
     },
     Metadata {
         code: "pcap",
-        short_desc: &["pcap"],
-        long_desc: &["pcap capture file"],
-        magic: &["pcap capture file"],
-        group: &["application"],
-        mime: &["application/vnd.tcpdump.pcap"],
+        desc: "pcap capture file",
+        magic: "pcap capture file",
+        group: "application",
+        mime: "application/vnd.tcpdump.pcap",
         extension: &["pcap", "pcapng"],
         is_text: false,
     },
     Metadata {
         code: "pdf",
-        short_desc: &["pdf"],
-        long_desc: &["PDF document"],
-        magic: &["PDF document"],
-        group: &["document"],
-        mime: &["application/pdf"],
+        desc: "PDF document",
+        magic: "PDF document",
+        group: "document",
+        mime: "application/pdf",
         extension: &["pdf"],
         is_text: false,
     },
     Metadata {
         code: "pebin",
-        short_desc: &["cpl", "dll", "exe", "mui", "ocx", "scr", "sys"],
-        long_desc: &["ELF executable", "PE Windows executable"],
-        magic: &["ELF executable", "PE Windows executable", "PE32 executable"],
-        group: &["application", "executable"],
-        mime: &["application/x-dosexec", "application/x-windows-driver"],
-        extension: &["cpl", "dll", "exe", "mui", "ocx", "scr", "sys"],
+        desc: "PE executable",
+        magic: "PE executable",
+        group: "executable",
+        mime: "application/x-dosexec",
+        extension: &["exe", "dll", "sys"],
         is_text: false,
     },
     Metadata {
         code: "pem",
-        short_desc: &["pem"],
-        long_desc: &["PEM certificate"],
-        magic: &["PEM certificate"],
-        group: &["application"],
-        mime: &["application/x-pem-file"],
+        desc: "PEM certificate",
+        magic: "PEM certificate",
+        group: "application",
+        mime: "application/x-pem-file",
         extension: &["pem", "pub"],
         is_text: true,
     },
     Metadata {
         code: "perl",
-        short_desc: &["perl"],
-        long_desc: &["Perl source"],
-        magic: &["Perl script text executable"],
-        group: &["code"],
-        mime: &["text/x-perl"],
+        desc: "Perl source",
+        magic: "Perl script text executable",
+        group: "code",
+        mime: "text/x-perl",
         extension: &["pl"],
         is_text: true,
     },
     Metadata {
         code: "php",
-        short_desc: &["php"],
-        long_desc: &["PHP source"],
-        magic: &["PHP script"],
-        group: &["code"],
-        mime: &["text/x-php"],
+        desc: "PHP source",
+        magic: "PHP script",
+        group: "code",
+        mime: "text/x-php",
         extension: &["php"],
         is_text: true,
     },
     Metadata {
         code: "png",
-        short_desc: &["png"],
-        long_desc: &["PNG image data"],
-        magic: &["PNG image data"],
-        group: &["image"],
-        mime: &["image/png"],
+        desc: "PNG image data",
+        magic: "PNG image data",
+        group: "image",
+        mime: "image/png",
         extension: &["png"],
         is_text: false,
     },
     Metadata {
         code: "postscript",
-        short_desc: &["postscript"],
-        long_desc: &["PostScript document"],
-        magic: &["PostScript document text"],
-        group: &["document"],
-        mime: &["application/postscript"],
+        desc: "PostScript document",
+        magic: "PostScript document text",
+        group: "document",
+        mime: "application/postscript",
         extension: &["ps"],
         is_text: false,
     },
     Metadata {
         code: "powershell",
-        short_desc: &["powershell"],
-        long_desc: &["Powershell source"],
-        magic: &["a powershell script"],
-        group: &["code"],
-        mime: &["application/x-powershell"],
+        desc: "Powershell source",
+        magic: "a powershell script",
+        group: "code",
+        mime: "application/x-powershell",
         extension: &["ps1"],
         is_text: true,
     },
     Metadata {
         code: "ppt",
-        short_desc: &["ppt"],
-        long_desc: &["Microsoft PowerPoint CDF document"],
-        magic: &["Composite Document File"],
-        group: &["document"],
-        mime: &["application/vnd.ms-powerpoint"],
+        desc: "Microsoft PowerPoint CDF document",
+        magic: "Composite Document File",
+        group: "document",
+        mime: "application/vnd.ms-powerpoint",
         extension: &["ppt"],
         is_text: false,
     },
     Metadata {
         code: "pptx",
-        short_desc: &["pptx"],
-        long_desc: &["Microsoft PowerPoint 2007+ document"],
-        magic: &["Microsoft PowerPoint 2007+"],
-        group: &["document"],
-        mime: &["application/vnd.openxmlformats-officedocument.presentationml.presentation"],
-        extension: &["pptm", "pptx"],
+        desc: "Microsoft PowerPoint 2007+ document",
+        magic: "Microsoft PowerPoint 2007+",
+        group: "document",
+        mime: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
+        extension: &["pptx", "pptm"],
         is_text: false,
     },
     Metadata {
         code: "python",
-        short_desc: &["python"],
-        long_desc: &["Python source"],
-        magic: &["Python script"],
-        group: &["code"],
-        mime: &["text/x-python"],
+        desc: "Python source",
+        magic: "Python script",
+        group: "code",
+        mime: "text/x-python",
         extension: &["py"],
         is_text: true,
     },
     Metadata {
         code: "pythonbytecode",
-        short_desc: &["pythonbytecode"],
-        long_desc: &["Python compiled bytecode"],
-        magic: &["python byte-compiled"],
-        group: &["executable"],
-        mime: &["application/x-bytecode.python"],
+        desc: "Python compiled bytecode",
+        magic: "python byte-compiled",
+        group: "executable",
+        mime: "application/x-bytecode.python",
         extension: &["pyc", "pyo"],
         is_text: false,
     },
     Metadata {
         code: "rar",
-        short_desc: &["rar"],
-        long_desc: &["RAR archive data"],
-        magic: &["RAR archive data"],
-        group: &["archive"],
-        mime: &["application/x-rar"],
+        desc: "RAR archive data",
+        magic: "RAR archive data",
+        group: "archive",
+        mime: "application/x-rar",
         extension: &["rar"],
         is_text: false,
     },
     Metadata {
         code: "rdf",
-        short_desc: &["rdf"],
-        long_desc: &["Resource Description Framework document (RDF)"],
-        magic: &["XML document"],
-        group: &["text"],
-        mime: &["application/rdf+xml"],
+        desc: "Resource Description Framework document (RDF)",
+        magic: "XML document",
+        group: "text",
+        mime: "application/rdf+xml",
         extension: &["rdf"],
         is_text: true,
     },
     Metadata {
         code: "rpm",
-        short_desc: &["rpm"],
-        long_desc: &["RedHat Package Manager archive (RPM)"],
-        magic: &["RPM"],
-        group: &["archive"],
-        mime: &["application/x-rpm"],
+        desc: "RedHat Package Manager archive (RPM)",
+        magic: "RPM",
+        group: "archive",
+        mime: "application/x-rpm",
         extension: &["rpm"],
         is_text: false,
     },
     Metadata {
         code: "rst",
-        short_desc: &["rst"],
-        long_desc: &["ReStructuredText document"],
-        magic: &["ReStructuredText file"],
-        group: &["text"],
-        mime: &["text/x-rst"],
+        desc: "ReStructuredText document",
+        magic: "ReStructuredText file",
+        group: "text",
+        mime: "text/x-rst",
         extension: &["rst"],
         is_text: true,
     },
     Metadata {
         code: "rtf",
-        short_desc: &["rtf"],
-        long_desc: &["Rich Text Format document"],
-        magic: &["Rich Text Format data"],
-        group: &["text"],
-        mime: &["text/rtf"],
+        desc: "Rich Text Format document",
+        magic: "Rich Text Format data",
+        group: "text",
+        mime: "text/rtf",
         extension: &["rtf"],
         is_text: true,
     },
     Metadata {
         code: "ruby",
-        short_desc: &["ruby"],
-        long_desc: &["Ruby source"],
-        magic: &["Ruby script"],
-        group: &["code"],
-        mime: &["application/x-ruby"],
+        desc: "Ruby source",
+        magic: "Ruby script",
+        group: "code",
+        mime: "application/x-ruby",
         extension: &["rb"],
         is_text: true,
     },
     Metadata {
         code: "rust",
-        short_desc: &["rust"],
-        long_desc: &["Rust source"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["application/x-rust"],
+        desc: "Rust source",
+        magic: "ASCII text",
+        group: "code",
+        mime: "application/x-rust",
         extension: &["rs"],
         is_text: true,
     },
     Metadata {
         code: "scala",
-        short_desc: &["scala"],
-        long_desc: &["Scala source"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["application/x-scala"],
+        desc: "Scala source",
+        magic: "ASCII text",
+        group: "code",
+        mime: "application/x-scala",
         extension: &["scala"],
         is_text: true,
     },
     Metadata {
         code: "sevenzip",
-        short_desc: &["sevenzip"],
-        long_desc: &["7-zip archive data"],
-        magic: &["7-zip archive data"],
-        group: &["archive"],
-        mime: &["application/x-7z-compressed"],
+        desc: "7-zip archive data",
+        magic: "7-zip archive data",
+        group: "archive",
+        mime: "application/x-7z-compressed",
         extension: &["7z"],
         is_text: false,
     },
     Metadata {
         code: "shell",
-        short_desc: &["shell"],
-        long_desc: &["Shell script"],
-        magic: &["shell script"],
-        group: &["code"],
-        mime: &["text/x-shellscript"],
+        desc: "Shell script",
+        magic: "shell script",
+        group: "code",
+        mime: "text/x-shellscript",
         extension: &["sh"],
         is_text: true,
     },
     Metadata {
         code: "smali",
-        short_desc: &["smali"],
-        long_desc: &["Smali source"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["application/x-smali"],
+        desc: "Smali source",
+        magic: "ASCII text",
+        group: "code",
+        mime: "application/x-smali",
         extension: &["smali"],
         is_text: true,
     },
     Metadata {
         code: "sql",
-        short_desc: &["sql"],
-        long_desc: &["SQL source"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["application/x-sql"],
+        desc: "SQL source",
+        magic: "ASCII text",
+        group: "code",
+        mime: "application/x-sql",
         extension: &["sql"],
         is_text: true,
     },
     Metadata {
         code: "squashfs",
-        short_desc: &["squashfs"],
-        long_desc: &["Squash filesystem"],
-        magic: &["Squashfs filesystem"],
-        group: &["archive"],
-        mime: &["application/octet-stream"],
+        desc: "Squash filesystem",
+        magic: "Squashfs filesystem",
+        group: "archive",
+        mime: "application/octet-stream",
         extension: &[],
         is_text: false,
     },
     Metadata {
         code: "svg",
-        short_desc: &["svg"],
-        long_desc: &["SVG Scalable Vector Graphics image data"],
-        magic: &["SVG Scalable Vector Graphics image"],
-        group: &["image"],
-        mime: &["image/svg+xml"],
+        desc: "SVG Scalable Vector Graphics image data",
+        magic: "SVG Scalable Vector Graphics image",
+        group: "image",
+        mime: "image/svg+xml",
         extension: &["svg"],
         is_text: true,
     },
     Metadata {
         code: "swf",
-        short_desc: &["swf"],
-        long_desc: &["Macromedia Flash data"],
-        magic: &["Macromedia Flash data"],
-        group: &["executable"],
-        mime: &["application/x-shockwave-flash"],
+        desc: "Macromedia Flash data",
+        magic: "Macromedia Flash data",
+        group: "executable",
+        mime: "application/x-shockwave-flash",
         extension: &["swf"],
         is_text: false,
     },
     Metadata {
         code: "symlinktext",
-        short_desc: &["symlinktext"],
-        long_desc: &["Symbolic link (textual representation)"],
-        magic: &["ASCII text"],
-        group: &["application"],
-        mime: &["text/plain"],
+        desc: "Symbolic link (textual representation)",
+        magic: "ASCII text",
+        group: "application",
+        mime: "text/plain",
         extension: &[],
         is_text: true,
     },
     Metadata {
         code: "tar",
-        short_desc: &["tar"],
-        long_desc: &["POSIX tar archive"],
-        magic: &["POSIX tar archive"],
-        group: &["archive"],
-        mime: &["application/x-tar"],
+        desc: "POSIX tar archive",
+        magic: "POSIX tar archive",
+        group: "archive",
+        mime: "application/x-tar",
         extension: &["tar"],
         is_text: false,
     },
     Metadata {
         code: "tga",
-        short_desc: &["tga"],
-        long_desc: &["Targa image data"],
-        magic: &["Targa image data"],
-        group: &["image"],
-        mime: &["image/x-tga"],
+        desc: "Targa image data",
+        magic: "Targa image data",
+        group: "image",
+        mime: "image/x-tga",
         extension: &["tga"],
         is_text: false,
     },
     Metadata {
         code: "tiff",
-        short_desc: &["tiff"],
-        long_desc: &["TIFF image data"],
-        magic: &["TIFF image data"],
-        group: &["image"],
-        mime: &["image/tiff"],
-        extension: &["tif", "tiff"],
+        desc: "TIFF image data",
+        magic: "TIFF image data",
+        group: "image",
+        mime: "image/tiff",
+        extension: &["tiff", "tif"],
         is_text: false,
     },
     Metadata {
         code: "torrent",
-        short_desc: &["torrent"],
-        long_desc: &["BitTorrent file"],
-        magic: &["BitTorrent file"],
-        group: &["application"],
-        mime: &["application/x-bittorrent"],
+        desc: "BitTorrent file",
+        magic: "BitTorrent file",
+        group: "application",
+        mime: "application/x-bittorrent",
         extension: &["torrent"],
         is_text: false,
     },
     Metadata {
         code: "ttf",
-        short_desc: &["ttf"],
-        long_desc: &["TrueType Font data"],
-        magic: &["TrueType Font data"],
-        group: &["font"],
-        mime: &["font/sfnt"],
+        desc: "TrueType Font data",
+        magic: "TrueType Font data",
+        group: "font",
+        mime: "font/sfnt",
         extension: &["ttf"],
         is_text: false,
     },
     Metadata {
         code: "txt",
-        short_desc: &["txt"],
-        long_desc: &["Generic text document"],
-        magic: &["ASCII text"],
-        group: &["text"],
-        mime: &["text/plain"],
+        desc: "Generic text document",
+        magic: "ASCII text",
+        group: "text",
+        mime: "text/plain",
         extension: &["txt"],
         is_text: true,
     },
     Metadata {
         code: "unknown",
-        short_desc: &["unknown"],
-        long_desc: &["Unknown binary data"],
-        magic: &["data"],
-        group: &["unknown"],
-        mime: &["application/octet-stream"],
+        desc: "Unknown binary data",
+        magic: "data",
+        group: "unknown",
+        mime: "application/octet-stream",
         extension: &[],
         is_text: false,
     },
     Metadata {
         code: "vba",
-        short_desc: &["vba"],
-        long_desc: &["MS Visual Basic source (VBA)"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["text/vbscript"],
+        desc: "MS Visual Basic source (VBA)",
+        magic: "ASCII text",
+        group: "code",
+        mime: "text/vbscript",
         extension: &["vbs"],
         is_text: true,
     },
     Metadata {
         code: "wav",
-        short_desc: &["wav"],
-        long_desc: &["Waveform Audio file (WAV)"],
-        magic: &["RIFF data"],
-        group: &["audio"],
-        mime: &["audio/x-wav"],
+        desc: "Waveform Audio file (WAV)",
+        magic: "RIFF data",
+        group: "audio",
+        mime: "audio/x-wav",
         extension: &["wav"],
         is_text: false,
     },
     Metadata {
         code: "webm",
-        short_desc: &["webm"],
-        long_desc: &["WebM data"],
-        magic: &["WebM"],
-        group: &["video"],
-        mime: &["video/webm"],
+        desc: "WebM data",
+        magic: "WebM",
+        group: "video",
+        mime: "video/webm",
         extension: &["webm"],
         is_text: false,
     },
     Metadata {
         code: "webp",
-        short_desc: &["webp"],
-        long_desc: &["WebP data"],
-        magic: &["RIFF data"],
-        group: &["image"],
-        mime: &["image/webp"],
+        desc: "WebP data",
+        magic: "RIFF data",
+        group: "image",
+        mime: "image/webp",
         extension: &["webp"],
         is_text: false,
     },
     Metadata {
         code: "winregistry",
-        short_desc: &["winregistry"],
-        long_desc: &["Windows Registry text"],
-        magic: &["Windows Registry text"],
-        group: &["application"],
-        mime: &["text/x-ms-regedit"],
+        desc: "Windows Registry text",
+        magic: "Windows Registry text",
+        group: "application",
+        mime: "text/x-ms-regedit",
         extension: &["reg"],
         is_text: true,
     },
     Metadata {
         code: "wmf",
-        short_desc: &["wmf"],
-        long_desc: &["Windows metafile"],
-        magic: &["Windows metafile"],
-        group: &["image"],
-        mime: &["image/wmf"],
+        desc: "Windows metafile",
+        magic: "Windows metafile",
+        group: "image",
+        mime: "image/wmf",
         extension: &["wmf"],
         is_text: false,
     },
     Metadata {
         code: "xar",
-        short_desc: &["xar"],
-        long_desc: &["XAR archive compressed data"],
-        magic: &["xar archive compressed"],
-        group: &["archive"],
-        mime: &["application/x-xar"],
+        desc: "XAR archive compressed data",
+        magic: "xar archive compressed",
+        group: "archive",
+        mime: "application/x-xar",
         extension: &["pkg", "xar"],
         is_text: false,
     },
     Metadata {
         code: "xls",
-        short_desc: &["xls"],
-        long_desc: &["Microsoft Excel CDF document"],
-        magic: &["Composite Document File"],
-        group: &["document"],
-        mime: &["application/vnd.ms-excel"],
+        desc: "Microsoft Excel CDF document",
+        magic: "Composite Document File",
+        group: "document",
+        mime: "application/vnd.ms-excel",
         extension: &["xls"],
         is_text: false,
     },
     Metadata {
         code: "xlsb",
-        short_desc: &["xlsb"],
-        long_desc: &["Microsoft Excel 2007+ document (binary format)"],
-        magic: &["Microsoft Excel 2007+"],
-        group: &["document"],
-        mime: &["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
+        desc: "Microsoft Excel 2007+ document (binary format)",
+        magic: "Microsoft Excel 2007+",
+        group: "document",
+        mime: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
         extension: &["xlsb"],
         is_text: false,
     },
     Metadata {
         code: "xlsx",
-        short_desc: &["xlsx"],
-        long_desc: &["Microsoft Excel 2007+ document"],
-        magic: &["Microsoft Excel 2007+"],
-        group: &["document"],
-        mime: &["application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],
-        extension: &["xlsm", "xlsx"],
+        desc: "Microsoft Excel 2007+ document",
+        magic: "Microsoft Excel 2007+",
+        group: "document",
+        mime: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        extension: &["xlsx", "xlsm"],
         is_text: false,
     },
     Metadata {
         code: "xml",
-        short_desc: &["xml"],
-        long_desc: &["XML document"],
-        magic: &["XML document"],
-        group: &["code"],
-        mime: &["text/xml"],
+        desc: "XML document",
+        magic: "XML document",
+        group: "code",
+        mime: "text/xml",
         extension: &["xml"],
         is_text: true,
     },
     Metadata {
         code: "xpi",
-        short_desc: &["xpi"],
-        long_desc: &["Compressed installation archive (XPI)"],
-        magic: &["Zip archive data"],
-        group: &["archive"],
-        mime: &["application/zip"],
+        desc: "Compressed installation archive (XPI)",
+        magic: "Zip archive data",
+        group: "archive",
+        mime: "application/zip",
         extension: &["xpi"],
         is_text: false,
     },
     Metadata {
         code: "xz",
-        short_desc: &["xz"],
-        long_desc: &["XZ compressed data"],
-        magic: &["XZ compressed data"],
-        group: &["archive"],
-        mime: &["application/x-xz"],
+        desc: "XZ compressed data",
+        magic: "XZ compressed data",
+        group: "archive",
+        mime: "application/x-xz",
         extension: &["xz"],
         is_text: false,
     },
     Metadata {
         code: "yaml",
-        short_desc: &["yaml"],
-        long_desc: &["YAML source"],
-        magic: &["ASCII text"],
-        group: &["code"],
-        mime: &["application/x-yaml"],
-        extension: &["yaml", "yml"],
+        desc: "YAML source",
+        magic: "ASCII text",
+        group: "code",
+        mime: "application/x-yaml",
+        extension: &["yml", "yaml"],
         is_text: true,
     },
     Metadata {
         code: "zip",
-        short_desc: &["zip"],
-        long_desc: &["Zip archive data"],
-        magic: &["Zip archive data"],
-        group: &["archive"],
-        mime: &["application/zip"],
+        desc: "Zip archive data",
+        magic: "Zip archive data",
+        group: "archive",
+        mime: "application/zip",
         extension: &["zip"],
         is_text: false,
     },
     Metadata {
         code: "zlibstream",
-        short_desc: &["zlibstream"],
-        long_desc: &["zlib compressed data"],
-        magic: &["zlib compressed data"],
-        group: &["application"],
-        mime: &["application/zlib"],
+        desc: "zlib compressed data",
+        magic: "zlib compressed data",
+        group: "application",
+        mime: "application/zlib",
         extension: &[],
         is_text: false,
     },
diff --git a/rust/lib/src/output.rs b/rust/lib/src/output.rs
index cd9ad56b..28ac0a1f 100644
--- a/rust/lib/src/output.rs
+++ b/rust/lib/src/output.rs
@@ -44,28 +44,23 @@ impl Label {
         METADATA[self as usize].code
     }
 
-    /// Returns a short description of the content type.
-    pub fn short_desc(self) -> &'static [&'static str] {
-        METADATA[self as usize].short_desc
-    }
-
-    /// Returns a long description of the content type.
-    pub fn long_desc(self) -> &'static [&'static str] {
-        METADATA[self as usize].long_desc
+    /// Returns the description of the content type.
+    pub fn desc(self) -> &'static str {
+        METADATA[self as usize].desc
     }
 
     /// Returns the magic of the content type.
-    pub fn magic(self) -> &'static [&'static str] {
+    pub fn magic(self) -> &'static str {
         METADATA[self as usize].magic
     }
 
     /// Returns the group of the content type.
-    pub fn group(self) -> &'static [&'static str] {
+    pub fn group(self) -> &'static str {
         METADATA[self as usize].group
     }
 
     /// Returns the MIME type of the content type.
-    pub fn mime(self) -> &'static [&'static str] {
+    pub fn mime(self) -> &'static str {
         METADATA[self as usize].mime
     }
 
@@ -82,11 +77,10 @@ impl Label {
 
 pub(crate) struct Metadata {
     pub(crate) code: &'static str,
-    pub(crate) short_desc: &'static [&'static str],
-    pub(crate) long_desc: &'static [&'static str],
-    pub(crate) magic: &'static [&'static str],
-    pub(crate) group: &'static [&'static str],
-    pub(crate) mime: &'static [&'static str],
+    pub(crate) desc: &'static str,
+    pub(crate) magic: &'static str,
+    pub(crate) group: &'static str,
+    pub(crate) mime: &'static str,
     pub(crate) extension: &'static [&'static str],
     pub(crate) is_text: bool,
 }