mod_file_type/
lib.rs

1use config::{get_or_create_sub_module, serialize_options};
2use file_type::FileType;
3use mlua::{IntoLua, Lua, LuaSerdeExt};
4use serde::Serialize;
5
6#[derive(Serialize)]
7struct FileTypeResult {
8    pub name: String,
9    pub extensions: Vec<String>,
10    pub media_types: Vec<String>,
11}
12
13impl Into<FileTypeResult> for &FileType {
14    fn into(self) -> FileTypeResult {
15        FileTypeResult {
16            name: self.name().to_string(),
17            extensions: self
18                .extensions()
19                .into_iter()
20                .map(|s| s.to_string())
21                .collect(),
22            media_types: self
23                .media_types()
24                .into_iter()
25                .map(|s| s.to_string())
26                .collect(),
27        }
28    }
29}
30
31impl IntoLua for FileTypeResult {
32    fn into_lua(self, lua: &Lua) -> mlua::Result<mlua::Value> {
33        lua.to_value_with(&self, serialize_options())
34    }
35}
36
37fn ft_to_lua(ft: &FileType, lua: &Lua) -> mlua::Result<mlua::Value> {
38    let res: FileTypeResult = ft.into();
39    res.into_lua(lua)
40}
41
42fn fts_to_lua(ft: &[&FileType], lua: &Lua) -> mlua::Result<mlua::Value> {
43    let fts: Vec<FileTypeResult> = ft.into_iter().map(|&ft| ft.into()).collect();
44    lua.to_value_with(&fts, serialize_options())
45}
46
47pub fn register(lua: &Lua) -> anyhow::Result<()> {
48    let ft_mod = get_or_create_sub_module(lua, "file_type")?;
49
50    ft_mod.set(
51        "from_bytes",
52        lua.create_function(move |lua, bytes: mlua::String| {
53            let ft = file_type::FileType::from_bytes(bytes.as_bytes());
54            ft_to_lua(&ft, lua)
55        })?,
56    )?;
57
58    ft_mod.set(
59        "from_extension",
60        lua.create_function(move |lua, extension: String| {
61            fts_to_lua(FileType::from_extension(&extension), lua)
62        })?,
63    )?;
64
65    ft_mod.set(
66        "from_media_type",
67        lua.create_function(move |lua, mt: String| {
68            fts_to_lua(FileType::from_media_type(&mt), lua)
69        })?,
70    )?;
71    Ok(())
72}