;;;; state.lisp -- functions for dealing with client state (in-package :oneliners.cli) ;;; Config Struct (defstruct config handle api-token host shell) (defvar *config* nil "Holds a config struct instance.") (defvar *cache* nil "Holds cached oneliners as a list.") ;;; GETTING AND SETTING STATE, DYNAMICALLY BOUND (defun merge-oneliners (new) "Modifies *CACHE*. Merge updated oneliners into the *cache*, ensuring to remove old versions." (setf *cache* (nconc new (delete-if (lambda (old-oneliner) (find (oneliner-id old-oneliner) new :key #'oneliner-id :test #'equal)) *cache*)))) (defun get-cached (id-or-name) "Looks up a oneliner instance by ID-OR-NAME using the current binding of *cache*. " (find id-or-name *cache* :key (etypecase id-or-name (integer #'oneliner-id) (string #'oneliner-name)) :test #'equal)) ;;; LOADING AND SAVING STATE (defun config-file () "Returns the pahtname holding the location of the config file." (merge-pathnames ".config/oneliners.config" (user-homedir-pathname))) (defun cached-oneliners-file () "Returns the pathname holding the location of the cache." (merge-pathnames ".cache/oneliners.cache" (user-homedir-pathname))) (defun wipe-cache () "Deletes the cache, if present." (uiop:delete-file-if-exists (cached-oneliners-file))) (defun write-config-to-disk () (print-to-file *config* (config-file))) (defun write-cache-to-disk () (print-to-file *cache* (cached-oneliners-file)))