diff --git a/babel.nim b/babel.nim index 9b2457a..3d29051 100644 --- a/babel.nim +++ b/babel.nim @@ -4,7 +4,7 @@ import packageinfo type TActionType = enum - ActionNil, ActionUpdate, ActionInstall + ActionNil, ActionUpdate, ActionInstall, ActionSearch TAction = object case typ: TActionType @@ -13,14 +13,21 @@ type optionalURL: string # Overrides default package list. of ActionInstall: optionalName: seq[string] # When this is @[], installs package from current dir. + of ActionSearch: + search: seq[string] # Search string. + byTag: bool const help = """ -Usage: babel COMMAND +Usage: babel COMMAND [opts] Commands: install Installs a list of packages. update Updates package list. A package list URL can be optionally specificed. + search Searches for a specified package. + +Search: + --tags Searches by tags, otherwise by name. """ babelVersion = "0.1.0" defaultPackageURL = "https://github.com/nimrod-code/packages/raw/master/packages.json" @@ -46,6 +53,10 @@ proc parseCmdLine(): TAction = of "update": result.typ = ActionUpdate result.optionalURL = "" + of "search": + result.typ = ActionSearch + result.search = @[] + result.byTag = false else: writeHelp() else: case result.typ @@ -55,10 +66,16 @@ proc parseCmdLine(): TAction = result.optionalName.add(key) of ActionUpdate: result.optionalURL = key + of ActionSearch: + result.search.add(key) of cmdLongOption, cmdShortOption: case key of "help", "h": writeHelp() of "version", "v": writeVersion() + of "tags", "t": + case result.typ + of ActionSearch: result.byTag = true + else: writeHelp() of cmdEnd: assert(false) # cannot happen if result.typ == ActionNil: writeHelp() @@ -197,6 +214,30 @@ proc install(packages: seq[String]) = else: quit("Package not found.", QuitFailure) +proc search(action: TAction) = + assert action.typ == ActionSearch + if action.search == @[]: + quit("Please specify a search string.", QuitFailure) + let pkgList = getPackageList(getBabelDir() / "packages.json") + var notFound = true + if action.byTag: + for pkg in pkgList: + for word in action.search: + if word in pkg.tags: + echoPackage(pkg) + echo(" ") + notFound = false + break + else: + for pkg in pkgList: + if pkg.name in action.search: + echoPackage(pkg) + echo(" ") + notFound = false + + if notFound: + echo("No package found.") + proc doAction(action: TAction) = case action.typ of ActionUpdate: @@ -206,6 +247,8 @@ proc doAction(action: TAction) = update() of ActionInstall: install(action.optionalName) + of ActionSearch: + search(action) of ActionNil: assert false diff --git a/packageinfo.nim b/packageinfo.nim index 8de5f5d..4d86b94 100644 --- a/packageinfo.nim +++ b/packageinfo.nim @@ -67,5 +67,22 @@ proc getPackage*(pkg: string, packagesPath: string, resPkg: var TPackage): bool return true return false - - \ No newline at end of file +proc getPackageList*(packagesPath: string): seq[TPackage] = + result = @[] + let packages = parseFile(packagesPath) + for p in packages: + var pkg: TPackage + pkg.name = p["name"].str + pkg.url = p["url"].str + pkg.downloadMethod = p["method"].str + pkg.tags = @[] + for t in p["tags"]: + pkg.tags.add(t.str) + pkg.description = p["description"].str + result.add(pkg) + +proc echoPackage*(pkg: TPackage) = + echo(pkg.name & ":") + echo(" url: " & pkg.url & " (" & pkg.downloadMethod & ")") + echo(" tags: " & pkg.tags.join(", ")) + echo(" description: " & pkg.description)