(defpackage #:utils (:use #:cl #:log4cl) (:export #:format-date #:i18n-load #:_ #:parse-iso-date #:request-params #:string-is-nil-or-empty-p #:separate-files-in-web-request) (:documentation "Utilities that do not depend on models.")) (in-package #:utils) (defun format-date (date) "Format the given date with the default date format (yyyy-mm-dd). Return a string." (local-time:format-timestring nil date :format +date-y-m-d+)) (defun asciify (string) (str:downcase (slug:asciify string))) (defun request-params (request) (loop :for (key . value) :in request :collect (let ((*package* (find-package :keyword))) (read-from-string key)) :collect value)) (defun string-is-nil-or-empty-p (string-to-test) "Tests to see if `STRING-TO-TEST' is empty of just whitespace. This is essentially the 'IsNullOrWhiteSpace' function I use in C#. It expands the 'empty string' check to include a check to see if there is string with just a '(white) space' in it." (if (or (string= string-to-test " ") (zerop (length string-to-test)) (null string-to-test)) t nil)) (defun separate-files-in-web-request (request &optional request-value) "Creates a new list of 'upload' files from a web `REQUEST'. You will mostly use this for processing a multi-file upload (HTML) form. The standard value for the 'name' attribute in (file) input tag in the HTML form is `CONTENT-FILES' but you can use a different name. Just specify it in this function's `REQUEST-VALUE' argument." (loop :for item :in request if (or (string= "CONTENT-FILES" (car item)) (string= request-value (car item))) collect item))