97 lines
2.7 KiB
V
97 lines
2.7 KiB
V
module starlight
|
|
|
|
import freeflowuniverse.herolib.osal.notifier
|
|
import os
|
|
|
|
fn watch_docs(docs_path string, path_src string, path_build string) ! {
|
|
mut n := notifier.new('docsite_watcher') or {
|
|
eprintln('Failed to create watcher: ${err}')
|
|
return
|
|
}
|
|
|
|
n.args['path_src'] = path_src
|
|
n.args['path_build'] = path_build
|
|
|
|
// Add watch with captured args
|
|
n.add_watch(docs_path, fn (event notifier.NotifyEvent, path string, args map[string]string) {
|
|
handle_file_change(event, path, args) or { eprintln('Error handling file change: ${err}') }
|
|
})!
|
|
|
|
n.start()!
|
|
}
|
|
|
|
// handle_file_change processes file system events
|
|
fn handle_file_change(event notifier.NotifyEvent, path string, args map[string]string) ! {
|
|
file_base := os.base(path)
|
|
is_dir := os.is_dir(path)
|
|
|
|
// Skip files starting with #
|
|
if file_base.starts_with('#') {
|
|
return
|
|
}
|
|
|
|
// For files (not directories), check extensions
|
|
if !is_dir {
|
|
ext := os.file_ext(path).to_lower()
|
|
if ext !in ['.md', '.png', '.jpeg', '.jpg'] {
|
|
return
|
|
}
|
|
}
|
|
|
|
// Get relative path from docs directory
|
|
rel_path := path.replace('${args['path_src']}/src/', '')
|
|
dest_path := '${args['path_build']}/src/${rel_path}'
|
|
|
|
match event {
|
|
.create, .modify {
|
|
if is_dir {
|
|
// For directories, just ensure they exist
|
|
os.mkdir_all(dest_path) or {
|
|
return error('Failed to create directory ${dest_path}: ${err}')
|
|
}
|
|
println('Created directory: ${rel_path}')
|
|
} else {
|
|
// For files, ensure parent directory exists and copy
|
|
os.mkdir_all(os.dir(dest_path)) or {
|
|
return error('Failed to create directory ${os.dir(dest_path)}: ${err}')
|
|
}
|
|
os.cp(path, dest_path) or {
|
|
return error('Failed to copy ${path} to ${dest_path}: ${err}')
|
|
}
|
|
println('Updated: ${rel_path}')
|
|
}
|
|
}
|
|
.delete {
|
|
if os.exists(dest_path) {
|
|
if is_dir {
|
|
os.rmdir_all(dest_path) or {
|
|
return error('Failed to delete directory ${dest_path}: ${err}')
|
|
}
|
|
println('Deleted directory: ${rel_path}')
|
|
} else {
|
|
os.rm(dest_path) or { return error('Failed to delete ${dest_path}: ${err}') }
|
|
println('Deleted: ${rel_path}')
|
|
}
|
|
}
|
|
}
|
|
.rename {
|
|
// For rename events, fswatch provides the new path in the event
|
|
// The old path is already removed, so we just need to handle the new path
|
|
if is_dir {
|
|
os.mkdir_all(dest_path) or {
|
|
return error('Failed to create directory ${dest_path}: ${err}')
|
|
}
|
|
println('Renamed directory to: ${rel_path}')
|
|
} else {
|
|
os.mkdir_all(os.dir(dest_path)) or {
|
|
return error('Failed to create directory ${os.dir(dest_path)}: ${err}')
|
|
}
|
|
os.cp(path, dest_path) or {
|
|
return error('Failed to copy ${path} to ${dest_path}: ${err}')
|
|
}
|
|
println('Renamed to: ${rel_path}')
|
|
}
|
|
}
|
|
}
|
|
}
|