src/pls.nim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 |
import json, os, parseopt, logging, algorithm, strutils, sequtils import plspkg/plslogger newPlsLogger().addHandler() setLogFilter(lvlInfo) import plspkg/config, plspkg/project let usage* = """ $1 v$2 - $3 (c) 2021 $4 Usage: pls <task> [<target>] Executes <task> (on <target>). => For more information on available tasks, run: pls help Options: --help, -h Displays this message. --log, -l Specifies the log level (debug|info|notice|warn|error|fatal). Default: info --version, -h Displays the version of the application. """ % [pkgTitle, pkgVersion, pkgDescription, pkgAuthor] # Helper Methods proc update(PROJECT: var PlsProject, sysProject: JsonNode): bool {.discardable.} = result = false let sysTasks = sysProject["tasks"] for k, v in sysTasks.pairs: if PROJECT.tasks.hasKey(k): let sysTask = sysTasks[k] var prjTask = PROJECT.tasks[k] for prop, val in sysTask.pairs: let sysProp = sysTask[prop] var prjProp = newJNull() if prjTask.hasKey(prop): prjProp = prjTask[prop] if prjProp == newJNull(): result = true # Adding new property prjTask[prop] = sysProp else: result = true # Adding new task PROJECT.tasks[k] = sysTasks[k] ### MAIN ### var args = newSeq[string](0) for kind, key, val in getopt(): case kind: of cmdArgument: args.add key of cmdLongOption, cmdShortOption: case key: of "log", "l": var val = val setLogLevel(val) of "help", "h": echo usage quit(0) of "version", "v": echo pkgVersion quit(0) else: discard else: discard var PROJECT: PlsProject if defined(windows): PROJECT = newPlsProject(getenv("USERPROFILE")) if not defined(windows): PROJECT = newPlsProject(getenv("HOME")) if not PROJECT.configured: PROJECT.init() PROJECT.load() let sysProject = plsTpl.parseJson() let version = sysProject["version"].getInt if PROJECT.version < version: notice "Updating pls.json file..." PROJECT.update(sysProject) PROJECT.version = version PROJECT.save() notice "Done." if args.len == 0: echo usage quit(0) case args[0]: of "info": if args.len < 2: for t, props in PROJECT.targets.pairs: echo "\n $1:" % [t] for k, v in props.pairs: echo " - $1:\t$2" % [k, $v] else: let alias = args[1] if not PROJECT.targets.hasKey(alias): fatal "Target '$1' not defined." % [alias] quit(4) let data = PROJECT.targets[alias] for k, v in data.pairs: echo "\n $1:\t$2" % [k, $v] of "help": echo "" if args.len < 2: var sortedKeys = toSeq(PROJECT.help.keys) sortedKeys.sort(cmp[string]) for k in sortedKeys: echo " pls $1" % PROJECT.help[k]["$syntax"].getStr echo " $1\n" % PROJECT.help[k]["$description"].getStr else: let cmd = args[1] let help = PROJECT.help[cmd] if not PROJECT.help.hasKey(cmd): fatal "Task '$1' is not defined." % cmd quit(5) echo " pls " & help["$syntax"].getStr echo "\n $1\n" % help["$description"].getStr else: if args.len < 1: echo usage quit(1) if args.len < 2: var targets = toSeq(PROJECT.targets.pairs) if targets.len == 0: warn "No targets defined - nothing to do." quit(0) for key, val in PROJECT.targets.pairs: PROJECT.execute(args[0], key) else: try: PROJECT.execute(args[0], args[1]) except: warn getCurrentExceptionMsg() |