Files
vdocs/vdocs.v
2025-05-29 22:31:59 +03:00

61 lines
1.7 KiB
V

module main
import flag
import log
import net.http.file
import os
import rand
import v.vmod
struct FlagConfig {
mut:
help bool
listen string = '127.0.0.1:4000' @[short: l]
dir string @[ignore]
}
fn main() {
mut flags, no_matches := flag.to_struct[FlagConfig](os.args, skip: 1, style: .go_flag) or {
eprintln('cmdline parsing error, see -help for info')
exit(2)
}
if no_matches.len == 0 {
flags.dir = '.'
} else if no_matches.len == 1 {
flags.dir = no_matches[0]
} else {
eprintln('unrecognized arguments: ${no_matches[1..]}')
exit(2)
}
if flags.help {
println('generate and serve HTML documentation for V module')
println('')
println('usage: vdocs [-l addr:port] [<dir>]')
println('')
println('options:')
println(' -help print this help message and exit')
println(' -l, -listen listen address, 127.0.0.1:4000 by default')
exit(0)
}
mut cache := vmod.get_cache()
modfile := cache.get_by_folder(os.getwd())
modname := vmod.from_file(modfile.vmod_file)!.name
tmp_dir := os.join_path(os.temp_dir(), os.geteuid().str(), modname + '_docs_' + rand.u32().hex())
log.info('generate HTML docs...')
os.mkdir_all(tmp_dir, mode: 0o755)!
os.execute_or_exit('v doc -f html -o ${tmp_dir} -m ${flags.dir} ')
signal_callback := fn [tmp_dir] (_ os.Signal) {
eprintln('\rCleanup...')
os.rmdir_all(tmp_dir) or {
log.error('unable to delete temporary dir ${tmp_dir}')
exit(1)
}
exit(0)
}
os.signal_opt(.int, signal_callback)!
os.signal_opt(.term, signal_callback)!
log.info('docs stored in temporary dir ${tmp_dir}')
log.info('use ^C to quit server')
file.serve(folder: tmp_dir, index_file: modname + '.html', on: flags.listen)
}