haxeui/haxeui-core

View on GitHub
cli/src/projects/TemplateProject.hx

Summary

Maintainability
Test Coverage
package projects;

import haxe.io.Path;
import sys.FileSystem;
import sys.io.File;

using StringTools;

class TemplateEntry {
    public function new() {
    }

    public var src:String;
    public var dst:String;
    public var binary:Bool = false;
    public var system:Bool = false;
    @:optional @:default(true) public var expandVars:Bool = true;
}

class TemplateProject extends Project {
    public var templates:Array<TemplateEntry> = [];

    public function new() {
        super();
    }

    public override function execute(params:Map<String, String>) {
        super.execute(params);

        var cwd = Sys.getCwd();

        for (t in templates) {
            var src = '${cwd}/cli/templates/${name}/${expandString(t.src, params)}';
            if (t.system == true) {
                src = expandString(t.src, params);
            }
            if (isExtensionBinary(src)) {
                t.binary = true;
            }
            var dst = expandString(t.dst, params);
            copyTemplate(src, dst, params, t.binary, t.expandVars);
        }
    }

    private static function isExtensionBinary(path:String) {
        if (path.endsWith(".png") || path.endsWith(".bmp") || path.endsWith(".gif") || path.endsWith(".jpg") || path.endsWith("jpeg") || path.endsWith(".ico") || path.endsWith(".icns")) {
            return true;
        }
        return false;
    }

    public static function copyTemplate(src:String, dst:String, vars:Map<String, String> = null, binary:Bool = false, expandVars:Bool = true) {
        var params:Dynamic = {};
        for (k in vars.keys()) {
            Reflect.setField(params, k, vars.get(k));
        }
        var env = Sys.environment();
        for (k in env.keys()) {
            Reflect.setField(params, k, env.get(k));
        }

        src = Path.normalize(src);
        dst = Path.normalize(dst);
        var force = (vars.exists("force") && vars.get("force") == "true");

        if (FileSystem.exists(src) == false) {
            if (binary == true) {
                throw 'Could not find binary file "${src}"';
            } else {
                throw 'Could not find template file "${src}"';
            }
        }

        if (FileSystem.exists(dst) == false || force == true) {
            if (binary == true) {
                Util.log('\t- Copying "${src}" to "${dst}" (as binary)');
            } else {
                Util.log('\t- Copying "${src}" to "${dst}"');
            }

            if (binary == false) {
                var content = File.getContent(src);

                if (expandVars) {
                    var t = new haxe.Template(content);
                    content = t.execute(params);
                }

                File.saveContent(dst, content);
            } else {
                File.copy(src, dst);
            }
        } else {
            Util.log('\t- Skipping "${dst}"');
        }
    }

}