Files
hank/hank/FileLoadingMacro.hx

84 lines
2.1 KiB
Haxe

package hank;
using StringTools;
using Lambda;
import haxe.macro.Context;
import haxe.macro.Expr;
import hank.HankBuffer;
class FileLoadingMacro {
public static macro function build(files:Array<String>):Array<Field> {
var fields = Context.getBuildFields();
var i = 0;
while (i < files.length) {
var file = files[i];
if (file.endsWith("/")) {
files.remove(file);
var dirFiles = recursiveLoop(file);
if (dirFiles.length == 0) {
trace('No files found in directory "$file"');
}
files = files.concat(dirFiles);
} else {
++i;
}
}
var loadedFiles = [for (file in files) macro $v{file} => $v{sys.io.File.getContent(file)}];
var filesField = {
name: "files",
doc: null,
meta: [],
access: [AStatic, APrivate],
kind: FVar(macro:Map<String, String>, macro $a{loadedFiles}),
pos: Context.currentPos()
};
var bufferFunction = {
name: "fileBuffer",
doc: null,
meta: [],
access: [AStatic, APrivate],
kind: FVar(macro:String->hank.HankBuffer, macro function(path) {
return new hank.HankBuffer(path, files[path]);
}),
pos: Context.currentPos()
}
fields.push(filesField);
fields.push(bufferFunction);
return fields;
}
// this function is nabbed from https://code.haxe.org/category/beginner/using-filesystem.html
static function recursiveLoop(directory:String, ?files:Array<String>):Array<String> {
if (files == null)
files = [];
if (sys.FileSystem.exists(directory)) {
// trace("directory found: " + directory);
for (file in sys.FileSystem.readDirectory(directory)) {
if (file.startsWith(".")) continue; // Avoid stat errors on Emacs and vim swap files ¯\_(ツ)_/¯
var path = haxe.io.Path.join([directory, file]);
if (!sys.FileSystem.isDirectory(path)) {
// trace("file found: " + path);
// do something with file
files.push(path.toString());
} else {
var directory = haxe.io.Path.addTrailingSlash(path);
// trace("directory found: " + directory);
files = recursiveLoop(directory, files);
}
}
} else {
// trace('"$directory" does not exists');
}
return files;
}
}