module main import os import flag import strings const ( tool_version = '0.0.4' tool_description = 'Converts a list of arbitrary files into a single v module file.' ) struct Context { mut: files []string prefix string show_help bool module_name string write_file string } fn (context Context) header() string { mut header_s := '' header_s += 'module ${context.module_name}\n' header_s += '\n' allfiles := context.files.join(' ') mut options := []string{} if context.prefix.len > 0 { options << '-p ${context.prefix}' } if context.module_name.len > 0 { options << '-m ${context.module_name}' } if context.write_file.len > 0 { options << '-w ${context.write_file}' } soptions := options.join(' ') header_s += '// File generated by:\n' header_s += '// v bin2v ${allfiles} ${soptions}\n' header_s += '// Please, do not edit this file.\n' header_s += '// Your changes may be overwritten.\n' header_s += '\n' header_s += 'const (\n' return header_s } fn (context Context) footer() string { return ')\n' } fn (context Context) file2v(file string) string { mut sb := strings.new_builder(1000) fname := os.file_name(file) fname_no_dots := fname.replace('.', '_') byte_name := '${context.prefix}${fname_no_dots}' fbytes := os.read_bytes(file) or { eprintln('Error: $err') return '' } fbyte := fbytes[0] sb.write(' ${byte_name}_len = ${fbytes.len}\n') sb.write(' ${byte_name} = [ byte(${fbyte}), \n ') for i := 1; i < fbytes.len; i++ { b := int(fbytes[i]).str() sb.write('${b:4s}, ') if 0 == i % 16 { sb.write('\n ') } } sb.write('\n]!!\n') sb.write('\n') return sb.str() } fn main() { mut context := Context{} mut fp := flag.new_flag_parser(os.args[1..]) fp.application('v bin2v') fp.version(tool_version) fp.description(tool_description) fp.arguments_description('FILE [FILE]...') context.show_help = fp.bool('help', `h`, false, 'Show this help screen.') context.module_name = fp.string('module', `m`, 'binary', 'Name of the generated module.') context.prefix = fp.string('prefix', `p`, '', 'A prefix put before each resource name.') context.write_file = fp.string('write', `w`, '', 'Write directly to a file with the given name.') if context.show_help { println(fp.usage()) exit(0) } files := fp.finalize() or { eprintln('Error: ' + err) exit(1) } real_files := files.filter(it != 'bin2v') if real_files.len == 0 { println(fp.usage()) exit(0) } context.files = real_files if !context.write_file.ends_with('.v') { context.write_file += '.v' } if context.write_file.len > 0 { mut out_file := os.create(context.write_file) or { panic(err) } out_file.write(context.header()) for file in real_files { out_file.write(context.file2v(file)) } out_file.write(context.footer()) } else { println(context.header()) for file in real_files { println(context.file2v(file)) } println(context.footer()) } }