63 lines
1.9 KiB
V
63 lines
1.9 KiB
V
module embedfs
|
|
|
|
import os
|
|
|
|
@[params]
|
|
pub struct EmbedFsParams {
|
|
pub:
|
|
module_name string = 'main' // name of the generated V module.
|
|
const_name string = 'embed_files' // name of the constant that will store the embedded data.
|
|
const_public bool // if true make the const public.
|
|
key_path_prefix string // path prefix for all embedded files, will be added to data map key.
|
|
file_path_prefix string // path prefix for files used in $embed_file() call in generated file.
|
|
compression bool // add zlib compression flag to $embed_file() call in generated file.
|
|
notice string = 'This file is generated by embedfs module, DO NOT EDIT!'
|
|
}
|
|
|
|
@[params]
|
|
pub struct GenerateParams {
|
|
EmbedFsParams
|
|
pub:
|
|
ignore []string // glob expressions for files that should not be embedded.
|
|
}
|
|
|
|
// generate generates the V code that embeds the contents of directory `dir`.
|
|
pub fn generate(dir string, params GenerateParams) !string {
|
|
files := collect_files(dir, params.ignore)
|
|
return generate_with(files, params.EmbedFsParams)!
|
|
}
|
|
|
|
// generate_with generates the V code that embeds the files listed in `paths`.
|
|
pub fn generate_with(paths []string, params EmbedFsParams) !string {
|
|
module_name := params.module_name
|
|
const_name := params.const_name
|
|
const_public := params.const_public
|
|
compression := params.compression
|
|
notice := params.notice
|
|
skip_notice := params.notice == ''
|
|
mut files := map[string]string{}
|
|
for file in paths {
|
|
file_path := if params.file_path_prefix == '' {
|
|
file
|
|
} else {
|
|
os.join_path_single(params.file_path_prefix, file)
|
|
}
|
|
files[os.join_path_single(params.key_path_prefix, file)] = file_path
|
|
}
|
|
result := $tmpl('embedfs.template')
|
|
return result
|
|
}
|
|
|
|
fn collect_files(path string, ignore []string) []string {
|
|
mut file_list := &[]string{}
|
|
os.walk(path, fn [mut file_list, ignore] (file string) {
|
|
for globexpr in ignore {
|
|
if file.match_glob(globexpr) {
|
|
return
|
|
}
|
|
}
|
|
file_list << file
|
|
})
|
|
return *file_list
|
|
}
|