1use std::path::PathBuf;
3
4use crate::prelude::*;
5
6pub fn get(lua: &Lua) -> LuaResult<LuaTable> {
8 vim::get(lua)?.get::<_, LuaTable>("fn")
9}
10
11pub fn stdpath(lua: &Lua, path: &str) -> LuaResult<String> {
13 self::get(lua)?.get::<_, LuaFunction>("stdpath")?.call(path)
14}
15
16pub fn tmpname(lua: &Lua) -> LuaResult<String> {
18 self::get(lua)?.get::<_, LuaFunction>("tempname")?.call(())
19}
20
21pub fn line(lua: &Lua, line: &str) -> LuaResult<u64> {
23 self::get(lua)?.get::<_, LuaFunction>("line")?.call(line)
24}
25
26pub fn foldclosedend(lua: &Lua, line: u64) -> LuaResult<i64> {
28 self::get(lua)?
29 .get::<_, LuaFunction>("foldclosedend")?
30 .call(line)
31}
32
33pub fn foldclosed(lua: &Lua, line: u64) -> LuaResult<i64> {
35 vim::func::get(lua)?.call_function("foldclosed", line)
36}
37
38pub fn indent(lua: &Lua, line: u64) -> LuaResult<u64> {
40 self::get(lua)?.get::<_, LuaFunction>("indent")?.call(line)
41}
42
43pub fn shiftwidth(lua: &Lua) -> LuaResult<u64> {
45 self::get(lua)?
46 .get::<_, LuaFunction>("shiftwidth")?
47 .call(())
48}
49
50#[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
96pub 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
116pub fn setline(lua: &Lua, line: u64, text: &str) -> LuaResult<bool> {
118 self::get(lua)?
119 .get::<_, LuaFunction>("setline")?
120 .call((line, text))
121}
122
123pub 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
130pub fn mode(lua: &Lua) -> LuaResult<String> {
132 vim::func::get(lua)?.call_function("mode", ())
133}