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 From<&FileType> for FileTypeResult {
14    fn from(val: &FileType) -> Self {
15        FileTypeResult {
16            name: val.name().to_string(),
17            extensions: val.extensions().iter().map(|s| s.to_string()).collect(),
18            media_types: val.media_types().iter().map(|s| s.to_string()).collect(),
19        }
20    }
21}
22
23impl IntoLua for FileTypeResult {
24    fn into_lua(self, lua: &Lua) -> mlua::Result<mlua::Value> {
25        lua.to_value_with(&self, serialize_options())
26    }
27}
28
29fn ft_to_lua(ft: &FileType, lua: &Lua) -> mlua::Result<mlua::Value> {
30    let res: FileTypeResult = ft.into();
31    res.into_lua(lua)
32}
33
34fn fts_to_lua(ft: &[&FileType], lua: &Lua) -> mlua::Result<mlua::Value> {
35    let fts: Vec<FileTypeResult> = ft.iter().map(|&ft| ft.into()).collect();
36    lua.to_value_with(&fts, serialize_options())
37}
38
39pub fn register(lua: &Lua) -> anyhow::Result<()> {
40    let ft_mod = get_or_create_sub_module(lua, "file_type")?;
41
42    ft_mod.set(
43        "from_bytes",
44        lua.create_function(move |lua, bytes: mlua::String| {
45            let ft = file_type::FileType::from_bytes(bytes.as_bytes());
46            ft_to_lua(&ft, lua)
47        })?,
48    )?;
49
50    ft_mod.set(
51        "from_extension",
52        lua.create_function(move |lua, extension: String| {
53            fts_to_lua(FileType::from_extension(&extension), lua)
54        })?,
55    )?;
56
57    ft_mod.set(
58        "from_media_type",
59        lua.create_function(move |lua, mt: String| {
60            fts_to_lua(FileType::from_media_type(&mt), lua)
61        })?,
62    )?;
63    Ok(())
64}