v.embedfile: make path public (#12614)
							parent
							
								
									ddec89f9ee
								
							
						
					
					
						commit
						0f59d88ba6
					
				|  | @ -2,10 +2,13 @@ module embed_file | ||||||
| 
 | 
 | ||||||
| import os | import os | ||||||
| 
 | 
 | ||||||
|  | pub const ( | ||||||
|  | 	is_used = 1 | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // https://github.com/vlang/rfcs/blob/master/embedding_resources.md
 | // https://github.com/vlang/rfcs/blob/master/embedding_resources.md
 | ||||||
| // EmbedFileData encapsulates functionality for the `$embed_file()` compile time call.
 | // EmbedFileData encapsulates functionality for the `$embed_file()` compile time call.
 | ||||||
| pub struct EmbedFileData { | pub struct EmbedFileData { | ||||||
| 	path  string |  | ||||||
| 	apath string | 	apath string | ||||||
| mut: | mut: | ||||||
| 	compressed        &byte | 	compressed        &byte | ||||||
|  | @ -13,11 +16,12 @@ mut: | ||||||
| 	free_compressed   bool | 	free_compressed   bool | ||||||
| 	free_uncompressed bool | 	free_uncompressed bool | ||||||
| pub: | pub: | ||||||
| 	len int | 	len  int | ||||||
|  | 	path string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub fn (ed EmbedFileData) str() string { | pub fn (ed EmbedFileData) str() string { | ||||||
| 	return 'embed_file.EmbedFileData{ len: $ed.len, path: "$ed.path", path: "$ed.apath", uncompressed: ${ptr_str(ed.uncompressed)} }' | 	return 'embed_file.EmbedFileData{ len: $ed.len, path: "$ed.path", apath: "$ed.apath", uncompressed: ${ptr_str(ed.uncompressed)} }' | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| [unsafe] | [unsafe] | ||||||
|  |  | ||||||
|  | @ -6,6 +6,7 @@ fn test_const_embed_file() { | ||||||
| 	assert file.len == 603 | 	assert file.len == 603 | ||||||
| 	fdata := file.data() | 	fdata := file.data() | ||||||
| 	eprintln('file after .data() call: $file') | 	eprintln('file after .data() call: $file') | ||||||
|  | 	assert file.path == 'v.png' | ||||||
| 	assert file.len == 603 | 	assert file.len == 603 | ||||||
| 	unsafe { | 	unsafe { | ||||||
| 		assert fdata.vbytes(4) == [byte(0x89), `P`, `N`, `G`] | 		assert fdata.vbytes(4) == [byte(0x89), `P`, `N`, `G`] | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | import v.embed_file | ||||||
|  | 
 | ||||||
|  | fn test_embed_file_with_import() { | ||||||
|  | 	mut file := $embed_file('v.png') | ||||||
|  | 	eprintln('file: $file') | ||||||
|  | 	assert file.len == 603 | ||||||
|  | 	fdata := file.data() | ||||||
|  | 	eprintln('file after .data() call: $file') | ||||||
|  | 	assert file.len == 603 | ||||||
|  | 	unsafe { | ||||||
|  | 		assert fdata.vbytes(4) == [byte(0x89), `P`, `N`, `G`] | ||||||
|  | 	} | ||||||
|  | 	assert check_file(file) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn check_file(file embed_file.EmbedFileData) bool { | ||||||
|  | 	return file.len == 603 | ||||||
|  | } | ||||||
| Before Width: | Height: | Size: 603 B After Width: | Height: | Size: 603 B | 
|  | @ -98,7 +98,7 @@ fn prepare_bin2v_file(mut fmt_bench benchmark.Benchmark) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn write_bin2v_keep_content() ? { | fn write_bin2v_keep_content() ? { | ||||||
| 	img0 := os.join_path('vlib', 'v', 'embed_file', 'v.png') | 	img0 := os.join_path('vlib', 'v', 'embed_file', 'tests', 'v.png') | ||||||
| 	img1 := os.join_path('tutorials', 'building_a_simple_web_blog_with_vweb', 'img', 'time.png') | 	img1 := os.join_path('tutorials', 'building_a_simple_web_blog_with_vweb', 'img', 'time.png') | ||||||
| 	os.rm(b2v_keep_path) ? | 	os.rm(b2v_keep_path) ? | ||||||
| 	res := os.execute('$vexe bin2v -w $b2v_keep_path $img0 $img1') | 	res := os.execute('$vexe bin2v -w $b2v_keep_path $img0 $img1') | ||||||
|  |  | ||||||
|  | @ -14,7 +14,12 @@ fn (mut g Gen) embed_file_is_prod_mode() bool { | ||||||
| fn (mut g Gen) gen_embed_file_init(node ast.ComptimeCall) { | fn (mut g Gen) gen_embed_file_init(node ast.ComptimeCall) { | ||||||
| 	g.writeln('(v__embed_file__EmbedFileData){') | 	g.writeln('(v__embed_file__EmbedFileData){') | ||||||
| 	g.writeln('\t\t.path = ${ctoslit(node.embed_file.rpath)},') | 	g.writeln('\t\t.path = ${ctoslit(node.embed_file.rpath)},') | ||||||
| 	g.writeln('\t\t.apath = ${ctoslit(node.embed_file.apath)},') | 	if g.embed_file_is_prod_mode() { | ||||||
|  | 		// apath is not needed in production and may leak information
 | ||||||
|  | 		g.writeln('\t\t.apath = ${ctoslit('')},') | ||||||
|  | 	} else { | ||||||
|  | 		g.writeln('\t\t.apath = ${ctoslit(node.embed_file.apath)},') | ||||||
|  | 	} | ||||||
| 	file_size := os.file_size(node.embed_file.apath) | 	file_size := os.file_size(node.embed_file.apath) | ||||||
| 	if file_size > 5242880 { | 	if file_size > 5242880 { | ||||||
| 		eprintln('Warning: embedding of files >= ~5MB is currently not supported') | 		eprintln('Warning: embedding of files >= ~5MB is currently not supported') | ||||||
|  |  | ||||||
|  | @ -26,6 +26,7 @@ v__embed_file__EmbedFileIndexEntry* v__embed_file__find_index_entry_by_path(void | ||||||
| 
 | 
 | ||||||
| v__embed_file__EmbedFileData my_source = (v__embed_file__EmbedFileData){ | v__embed_file__EmbedFileData my_source = (v__embed_file__EmbedFileData){ | ||||||
| .path = _SLIT("embed.vv"), | .path = _SLIT("embed.vv"), | ||||||
|  | .apath = _SLIT(""), | ||||||
| .compressed = v__embed_file__find_index_entry_by_path((voidptr)_v_embed_file_index, _SLIT("embed.vv"))->data, | .compressed = v__embed_file__find_index_entry_by_path((voidptr)_v_embed_file_index, _SLIT("embed.vv"))->data, | ||||||
| 
 | 
 | ||||||
| // Initializations for module v.embed_file : | // Initializations for module v.embed_file : | ||||||
|  |  | ||||||
|  | @ -125,7 +125,7 @@ fn (mut p Parser) comptime_call() ast.ComptimeCall { | ||||||
| 				epath = abs_path | 				epath = abs_path | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		p.register_auto_import('v.embed_file') | 		p.register_auto_import('v.preludes.embed_file') | ||||||
| 		return ast.ComptimeCall{ | 		return ast.ComptimeCall{ | ||||||
| 			scope: 0 | 			scope: 0 | ||||||
| 			is_embed: true | 			is_embed: true | ||||||
|  |  | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | module embed_file | ||||||
|  | 
 | ||||||
|  | // This prelude is loaded in every v program that uses `$embed_file`,
 | ||||||
|  | // in both the main executable, and in the shared library.
 | ||||||
|  | import v.embed_file | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	no_warning_embed_file_is_used = embed_file.is_used | ||||||
|  | ) | ||||||
		Loading…
	
		Reference in New Issue