---@meta lfs

--------------------------------------------------------------------------------
-- LuaFileSystem C 模块
--------------------------------------------------------------------------------

---@alias lfs_mode 'file'|'directory'|'link'|'socket'|'named pipe'|'char device'|'block device'|'other'
---@alias lfs_attribute_name 'mode'|'dev'|'ino'|'nlink'|'uid'|'gid'|'rdev'|'access'|'modification'|'change'|'size'|'permissions'|'blocks'|'blksize'
---@alias lfs_lock_mode 'r'|'w'
---@alias lfs_setmode 'binary'|'text'

---@class lfs_attributes*
---@field mode lfs_mode 文件类型
---@field dev integer 设备号
---@field ino integer inode
---@field nlink integer 硬链接数
---@field uid integer owner user id
---@field gid integer owner group id
---@field rdev integer 特殊设备号
---@field access integer 最后访问时间
---@field modification integer 最后修改时间
---@field change integer 状态变更时间
---@field size integer 文件大小
---@field permissions string 权限字符串
---@field blocks? integer 分配块数
---@field blksize? integer 最优 I/O 块大小

---@class lfs_dir*
local lfs_dir = {}

--- 获取下一个目录项。
---@return string? name 目录项名称
---@return string? errMsg 错误信息
function lfs_dir:next() end

--- 关闭目录迭代器。
function lfs_dir:close() end

---@class lfs_lock*
local lfs_lock = {}

--- 释放目录锁。
function lfs_lock:free() end

---@class lfs*
---@field _COPYRIGHT string 版权信息
---@field _DESCRIPTION string 模块描述
---@field _VERSION string 版本
---@type lfs*
local M = {}

--- 获取文件属性。
---@param filepath string 文件路径
---@param request? lfs_attribute_name|lfs_attributes* 属性名或复用结果表
---@return lfs_attributes*|string|integer? value 属性表或单个属性值
---@return string? errMsg 错误信息
---@return integer? errNo 系统错误码
function M.attributes(filepath, request) end

--- 切换当前目录。
---@param path string 目录路径
---@return boolean? ok 成功时为 true
---@return string? errMsg 错误信息
function M.chdir(path) end

--- 获取当前目录。
---@return string? path 当前目录
---@return string? errMsg 错误信息
---@return integer? errNo 系统错误码
function M.currentdir() end

--- 创建目录迭代器。
---@param path string 目录路径
---@return fun(dir:lfs_dir*):string? iter 迭代函数
---@return lfs_dir* dir 目录对象
function M.dir(path) end

--- 创建硬链接或符号链接。
---@param oldpath string 目标路径
---@param newpath string 链接路径
---@param symbolic? boolean 是否创建符号链接
---@return boolean? ok 成功时为 true
---@return string? errMsg 错误信息
---@return integer? errNo 系统错误码
function M.link(oldpath, newpath, symbolic) end

--- 锁定文件区域。
---@param file file* 文件对象
---@param mode lfs_lock_mode 锁模式
---@param start? integer 起始偏移
---@param length? integer 长度
---@return boolean? ok 成功时为 true
---@return string? errMsg 错误信息
function M.lock(file, mode, start, length) end

--- 创建目录。
---@param path string 目录路径
---@return boolean? ok 成功时为 true
---@return string? errMsg 错误信息
---@return integer? errNo 系统错误码
function M.mkdir(path) end

--- 删除目录。
---@param path string 目录路径
---@return boolean? ok 成功时为 true
---@return string? errMsg 错误信息
---@return integer? errNo 系统错误码
function M.rmdir(path) end

--- 获取符号链接自身属性。
---@param filepath string 文件路径
---@param request? lfs_attribute_name|lfs_attributes* 属性名或复用结果表
---@return lfs_attributes*|string|integer? value 属性表或单个属性值
---@return string? errMsg 错误信息
---@return integer? errNo 系统错误码
function M.symlinkattributes(filepath, request) end

--- 设置文件文本/二进制模式。
---@param file file* 文件对象
---@param mode lfs_setmode 模式
---@return boolean? ok 成功时为 true
---@return lfs_setmode|string? previous 之前模式或错误信息
---@return integer? errNo 系统错误码
function M.setmode(file, mode) end

--- 修改文件访问和修改时间。
---@param filepath string 文件路径
---@param accessTime? integer 访问时间；不传时使用当前时间
---@param modificationTime? integer 修改时间；不传时使用 accessTime
---@return boolean? ok 成功时为 true
---@return string? errMsg 错误信息
---@return integer? errNo 系统错误码
function M.touch(filepath, accessTime, modificationTime) end

--- 解锁文件区域。
---@param file file* 文件对象
---@param start? integer 起始偏移
---@param length? integer 长度
---@return boolean? ok 成功时为 true
---@return string? errMsg 错误信息
function M.unlock(file, start, length) end

--- 创建目录锁。
---@param path string 目录路径
---@return lfs_lock*? lock 锁对象
---@return string? errMsg 错误信息
function M.lock_dir(path) end

return M
