aboutsummaryrefslogtreecommitdiff
path: root/app/search.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'app/search.lisp')
-rw-r--r--app/search.lisp76
1 files changed, 76 insertions, 0 deletions
diff --git a/app/search.lisp b/app/search.lisp
new file mode 100644
index 0000000..015a749
--- /dev/null
+++ b/app/search.lisp
@@ -0,0 +1,76 @@
+;;;; search.lisp -- search function interface for oneliners wiki cli
+
+(in-package :oneliners.cli.app )
+
+(defun search/options ()
+ "Returns a list of options for the search command."
+ (list
+ (cli:make-option
+ :integer
+ :short-name #\l
+ :long-name "limit"
+ :description "number of results to return"
+ :initial-value 10
+ :key :limit)
+ (cli:make-option
+ :flag
+ :short-name #\f
+ :long-name "flagged"
+ :description "only flagged oneliners are returned"
+ :key :flagged)
+ (cli:make-option
+ :flag
+ :short-name #\F
+ :long-name "no-flagged"
+ :description "only unflagged oneliners are returned"
+ :key :no-flagged)
+ (cli:make-option
+ :flag
+ :short-name #\n
+ :long-name "newest"
+ :description "the newest matching oneliners are returned"
+ :key :newest)))
+
+(defun search/handler (cmd)
+ "Handler function for the search command. "
+ (let ((args
+ (cli:command-arguments cmd))
+ (limit
+ (cli:getopt cmd :limit)))
+ (cond
+ (args
+ ;; if there are search terms, call the main search function
+ (ol:search-for-oneliners
+ args
+ limit
+ (cli:getopt cmd :no-flagged)
+ (cli:getopt cmd :flagged)
+ (cli:getopt cmd :newest)))
+
+ ;; if no search terms, but --newest or -n
+ ((cli:getopt cmd :newest)
+ (ol::newest-oneliners limit))
+
+ ;; no args, but --flagged or -f
+ ((cli:getopt cmd :flagged)
+ (ol::all-flagged-oneliners limit))
+
+ (t
+ (cli::print-usage-and-exit cmd t)))))
+
+
+(defparameter +search/examples+
+ '(("Search for oneliners involving grep and awk" .
+ "ol search grep awk")
+ ("Limit search to flagged oneliners (useful for contributors)" .
+ "ol search --flagged grep awk")))
+
+
+(defun search/command ()
+ "Creates a new command for interfacing with the search api."
+ (cli:make-command
+ :name "search"
+ :description "search for oneliners with provided tags"
+ :options (search/options)
+ :handler #'search/handler
+ :examples +search/examples+))