46 lines
1.2 KiB
Text
46 lines
1.2 KiB
Text
--!strict
|
|
local fs = require("@lune/fs")
|
|
local task = require("@lune/task")
|
|
|
|
local function watch(path: string, on_change: (path: string, contents: string) -> (), run_initially: boolean?)
|
|
local initial_metadata = fs.metadata(path)
|
|
if not initial_metadata.exists then
|
|
return
|
|
end
|
|
|
|
if run_initially then
|
|
local initial_contents = fs.readFile(path)
|
|
|
|
local initial_success, why = pcall(on_change :: any, path, initial_contents) -- :: any because otherwise it shits itself and the type doesn't give (boolean, string)??
|
|
if not initial_success then
|
|
warn(`There was an error while trying to start the watcher thread:\n{why}`)
|
|
return
|
|
end
|
|
end
|
|
|
|
local last_modification = initial_metadata.modifiedAt
|
|
|
|
while true do
|
|
local metadata = fs.metadata(path)
|
|
|
|
if not metadata.exists then
|
|
continue
|
|
end
|
|
|
|
if metadata.modifiedAt == last_modification then
|
|
continue
|
|
end
|
|
last_modification = metadata.modifiedAt
|
|
|
|
local contents = fs.readFile(path)
|
|
|
|
local success, err = pcall(on_change :: any, path, contents)
|
|
if not success then
|
|
warn(err)
|
|
end
|
|
|
|
task.wait(1)
|
|
end
|
|
end
|
|
|
|
return watch
|