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}