nvim_utils/vim/
func.rs

1//! Corresponds to `vim.fn`
2use std::path::PathBuf;
3
4use crate::prelude::*;
5
6/// Gets the `vim.fn` table
7pub fn get(lua: &Lua) -> LuaResult<LuaTable> {
8    vim::get(lua)?.get::<_, LuaTable>("fn")
9}
10
11/// Corresponds to `vim.fn.stdpath`
12pub fn stdpath(lua: &Lua, path: &str) -> LuaResult<String> {
13    self::get(lua)?.get::<_, LuaFunction>("stdpath")?.call(path)
14}
15
16/// Corresponds to `vim.fn.tmpname`
17pub fn tmpname(lua: &Lua) -> LuaResult<String> {
18    self::get(lua)?.get::<_, LuaFunction>("tempname")?.call(())
19}
20
21/// Corresponds to `vim.fn.line`
22pub fn line(lua: &Lua, line: &str) -> LuaResult<u64> {
23    self::get(lua)?.get::<_, LuaFunction>("line")?.call(line)
24}
25
26/// Corresponds to `vim.fn.foldclosedend`
27pub fn foldclosedend(lua: &Lua, line: u64) -> LuaResult<i64> {
28    self::get(lua)?
29        .get::<_, LuaFunction>("foldclosedend")?
30        .call(line)
31}
32
33/// Corresponds to `vim.fn.foldclosed`
34pub fn foldclosed(lua: &Lua, line: u64) -> LuaResult<i64> {
35    vim::func::get(lua)?.call_function("foldclosed", line)
36}
37
38/// Corresponds to `vim.fn.indent`
39pub fn indent(lua: &Lua, line: u64) -> LuaResult<u64> {
40    self::get(lua)?.get::<_, LuaFunction>("indent")?.call(line)
41}
42
43/// Corresponds to `vim.fn.shiftwidth`
44pub fn shiftwidth(lua: &Lua) -> LuaResult<u64> {
45    self::get(lua)?
46        .get::<_, LuaFunction>("shiftwidth")?
47        .call(())
48}
49
50/// The result of a GetLine call, either a string or a table (array) of strings
51/// Can be used with match, or if you know the type you can use `into_string` or `into_table`
52#[derive(Debug, Clone)]
53pub enum GetLineResult {
54    String(String),
55    Table(Vec<String>),
56}
57
58impl<'a> FromLua<'a> for GetLineResult {
59    fn from_lua(val: LuaValue<'a>, lua: &'a Lua) -> LuaResult<Self> {
60        match &val {
61            LuaValue::String(_) => Ok(GetLineResult::String(lua.unpack(val)?)),
62            LuaValue::Table(_) => Ok(GetLineResult::Table(lua.unpack(val)?)),
63            _ => Err(LuaError::FromLuaConversionError {
64                from: "LuaValue",
65                to: "GetLineResult",
66                message: Some("Invalid type".to_string()),
67            }),
68        }
69    }
70}
71
72impl GetLineResult {
73    pub fn into_string(self) -> LuaResult<String> {
74        match self {
75            GetLineResult::String(s) => Ok(s),
76            _ => Err(LuaError::FromLuaConversionError {
77                from: "LuaValue",
78                to: "GetLineResult",
79                message: Some("Invalid type".to_string()),
80            }),
81        }
82    }
83
84    pub fn into_table(self) -> LuaResult<Vec<String>> {
85        match self {
86            GetLineResult::Table(t) => Ok(t),
87            _ => Err(LuaError::FromLuaConversionError {
88                from: "LuaValue",
89                to: "GetLineResult",
90                message: Some("Invalid type".to_string()),
91            }),
92        }
93    }
94}
95
96/// Corresponds to `vim.fn.getline`
97pub fn getline(lua: &Lua, line: u64, end: Option<u64>) -> LuaResult<GetLineResult> {
98    let val = if let Some(end) = end {
99        self::get(lua)?.call_function("getline", (line, end))?
100    } else {
101        self::get(lua)?
102            .get::<_, LuaFunction>("getline")?
103            .call(line)?
104    };
105    match &val {
106        LuaValue::String(_) => Ok(GetLineResult::String(String::from_lua(val, lua)?)),
107        LuaValue::Table(_) => Ok(GetLineResult::Table(lua.unpack(val)?)),
108        _ => Err(LuaError::FromLuaConversionError {
109            from: "LuaValue",
110            to: "GetLineResult",
111            message: Some("Invalid type".to_string()),
112        }),
113    }
114}
115
116/// Corresponds to `vim.fn.setline`
117pub fn setline(lua: &Lua, line: u64, text: &str) -> LuaResult<bool> {
118    self::get(lua)?
119        .get::<_, LuaFunction>("setline")?
120        .call((line, text))
121}
122
123/// Corresponds to `vim.fn.getcwd`
124pub fn getcwd(lua: &Lua, win_num: Option<u64>, tab_num: Option<u64>) -> LuaResult<PathBuf> {
125    let cwd = self::get(lua)?
126        .call_function::<_, _, String>("getcwd", (win_num.unwrap_or(0), tab_num.unwrap_or(0)))?;
127    Ok(PathBuf::from(cwd))
128}
129
130/// Corresponds to `vim.fn.mode`
131pub fn mode(lua: &Lua) -> LuaResult<String> {
132    vim::func::get(lua)?.call_function("mode", ())
133}