96 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			V
		
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			V
		
	
	
| module main
 | |
| 
 | |
| import os
 | |
| import flag
 | |
| import filepath
 | |
| 
 | |
| const (
 | |
| 	tool_version = '0.0.3'
 | |
| 	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
 | |
| }
 | |
| 
 | |
| fn (context Context) header() {
 | |
| 	println('module ${context.module_name}')
 | |
| 	println('')
 | |
| 	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}'
 | |
| 	}
 | |
| 	soptions := options.join(' ')
 | |
| 	println('// File generated by:')
 | |
| 	println('//    v bin2v ${allfiles} ${soptions}')
 | |
| 	println('// Please, do not edit this file.')
 | |
| 	println('// Your changes may be overwritten.')
 | |
| 	println('')
 | |
| 	println('const (')
 | |
| }
 | |
| 
 | |
| fn (context Context) footer() {
 | |
| 	println(')')
 | |
| }
 | |
| 
 | |
| fn (context Context) file2v(file string) {
 | |
| 	fname := filepath.filename(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]
 | |
| 	println('  ${byte_name}_len = ${fbytes.len}')
 | |
| 	print('  ${byte_name} = [ byte(${fbyte}), \n  ')
 | |
| 	for i := 1; i < fbytes.len; i++ {
 | |
| 		b := int(fbytes[i]).str()
 | |
| 		print('${b:4s}, ')
 | |
| 		if 0 == i % 16 {
 | |
| 			print('\n  ')
 | |
| 		}
 | |
| 	}
 | |
| 	println('\n]!!')
 | |
| 	println('')
 | |
| }
 | |
| 
 | |
| 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.\n')
 | |
| 	context.prefix = fp.string_('prefix', `p`, '', 'A prefix put before each resource name.\n')
 | |
| 	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
 | |
| 	context.header()
 | |
| 	for file in real_files {
 | |
| 		context.file2v(file)
 | |
| 	}
 | |
| 	context.footer()
 | |
| }
 |