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}