;;;; state.lisp -- functions for dealing with client state ;; Copyright (C) 2022 Colin Okay ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU Affero General Public License as ;; published by the Free Software Foundation, either version 3 of the ;; License, or (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU Affero General Public License for more details. ;; You should have received a copy of the GNU Affero General Public License ;; along with this program. If not, see . (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)))