diff --git a/kiss/src/kiss/Main.hx b/kiss/src/kiss/Main.hx index bf60eb7b..e5078451 100644 --- a/kiss/src/kiss/Main.hx +++ b/kiss/src/kiss/Main.hx @@ -1,5 +1,6 @@ package kiss; +import sys.io.Process; #if macro import haxe.macro.Expr; import kiss.Kiss; @@ -7,9 +8,16 @@ import kiss.Reader; import kiss.Stream; using tink.MacroApi; -using StringTools; #end +import haxe.Json; +import haxe.io.Path; +import sys.io.File; +import sys.io.Process; +import sys.FileSystem; + +using StringTools; + class Main { static function main() { macroMain(); @@ -24,6 +32,8 @@ class Main { switch (args.shift()) { case "convert": convert(args); + case "new-project": + newProject(args); case other: // TODO show a helpful list of subcommands Sys.println('$other is not a kiss subcommand'); @@ -33,13 +43,71 @@ class Main { return macro null; } + static function promptFor(what:String, ?defaultVal:String) { + var prompt = what; + if (defaultVal != null) { + if (defaultVal.length == 0) { + prompt += ' (default empty)'; + } else { + prompt += ' (default $defaultVal)'; + } + } + prompt += ": "; + Sys.print(prompt); + var input = Sys.stdin().readLine(); + if (input.trim().length == 0) { + if (defaultVal != null) { + input = defaultVal; + } else { + Sys.println('value required for $what'); + Sys.exit(1); + } + } + return input; + } + + static function makeFileForNewProject(templateFile:Array, projectName:String, pkg:String) { + var kissLibPath = new Process("haxelib", ["libpath", "kiss"]).stdout.readAll().toString().trim(); + var fullTemplateFilePath = Path.join([kissLibPath, "template"].concat(templateFile)); + var newFileContent = File.getContent(fullTemplateFilePath).replace("template", pkg); + var templateFileInNewProject = [for (part in templateFile) if (part == "template") pkg else part]; + var newFilePath = Path.join([projectName].concat(templateFileInNewProject)); + File.saveContent(newFilePath, newFileContent); + } + + static function newProject(args:Array) { + var name = promptFor("name"); + var pkg = name.replace("-", "_"); + var haxelibJson = { + "name": name, + "url": promptFor("url"), + "license": promptFor("license", "LGPL"), + "tags": promptFor("tags (comma-separated)", "").split(","), + "description": promptFor("description", ""), + "version": "0.0.0", + "releasenote": "", + "contributors": [promptFor("author")], + "classPath": "src/", + "main": '${pkg}.Main', + "dependencies": { + "kiss": "" + } + }; + FileSystem.createDirectory('$name/src/$pkg'); + makeFileForNewProject(["src", "template", "Main.hx"], name, pkg); + makeFileForNewProject(["src", "template", "Main.kiss"], name, pkg); + makeFileForNewProject(["build.hxml"], name, pkg); + makeFileForNewProject(["test.sh"], name, pkg); + File.saveContent('$name/haxelib.json', Json.stringify(haxelibJson)); + } + static function convert(args:Array) { // `kiss convert` converts its stdin input to Haxe expressions. // with --all, it reads everything from stdin at once (for piping). Without --all, it acts as a repl, // where \ at the end of a line signals that the expression is not complete // TODO write tests for this // TODO use this to implement runAtRuntime() for sys targets by running a haxe subprocess - + #if macro var k = Kiss.defaultKissState(); k.wrapListExps = false; var pretty = args.indexOf("--pretty") != -1; @@ -83,7 +151,6 @@ class Main { } } catch (e:haxe.io.Eof) {} } - - var line = ""; + #end } } diff --git a/kiss/template/build.hxml b/kiss/template/build.hxml new file mode 100644 index 00000000..6e9b3b61 --- /dev/null +++ b/kiss/template/build.hxml @@ -0,0 +1,4 @@ +-lib kiss +-cp src +--main template.Main +--interp \ No newline at end of file diff --git a/kiss/template/haxelib.json b/kiss/template/haxelib.json new file mode 100644 index 00000000..3eebe88d --- /dev/null +++ b/kiss/template/haxelib.json @@ -0,0 +1,15 @@ +{ + "name": "template", + "url": "https://github.com/hissvn/kisslang", + "license": "LGPL", + "tags": [], + "description": "", + "version": "0.0.0", + "releasenote": "", + "contributors": ["NQNStudios"], + "classPath": "src/", + "main": "template.Main", + "dependencies": { + "kiss": "" + } +} \ No newline at end of file diff --git a/template/src/Main.hx b/kiss/template/src/template/Main.hx similarity index 82% rename from template/src/Main.hx rename to kiss/template/src/template/Main.hx index a2b9dd4d..e38e7391 100644 --- a/template/src/Main.hx +++ b/kiss/template/src/template/Main.hx @@ -1,4 +1,4 @@ -package; +package template; import kiss.Kiss; import kiss.Prelude; diff --git a/template/src/Main.kiss b/kiss/template/src/template/Main.kiss similarity index 100% rename from template/src/Main.kiss rename to kiss/template/src/template/Main.kiss diff --git a/template/test.sh b/kiss/template/test.sh old mode 100755 new mode 100644 similarity index 100% rename from template/test.sh rename to kiss/template/test.sh diff --git a/template/build.hxml b/template/build.hxml deleted file mode 100644 index c56fd45b..00000000 --- a/template/build.hxml +++ /dev/null @@ -1,4 +0,0 @@ --lib kiss --cp src ---main Main ---interp \ No newline at end of file