aboutsummaryrefslogtreecommitdiff
path: root/lib/state.lisp
diff options
context:
space:
mode:
authorColin Okay <okay@toyful.space>2022-03-18 16:45:53 -0500
committerColin Okay <okay@toyful.space>2022-03-18 16:45:53 -0500
commit90eebfe3109994eb2359f70e4cbaaedb48e2d9be (patch)
tree66e51dca2194ffb6d0e518aba96850cd194034b3 /lib/state.lisp
parentd30575d46cf61132a0a35bf2b650b4f05fc73595 (diff)
Squashed commit of the following:
commit e12b0ae984e5f106721ed866a96f918f19137295 Merge: 2cf6a98 d30575d Author: Colin Okay <okay@toyful.space> Date: Fri Mar 18 16:44:57 2022 -0500 Merge branch 'main' into rc-upstream commit 2cf6a9883b59fe27fc6cd4888261416a2e929be3 Author: Colin Okay <okay@toyful.space> Date: Tue Mar 15 16:33:56 2022 -0500 fixed odd help printout on `ol help` commit 3a19876d855ec8d2279293892e24716b28c4b48a Author: Colin Okay <okay@toyful.space> Date: Tue Mar 15 16:29:53 2022 -0500 added --confirm option. refactored run-item & co to accomodate commit fbce85871c6e995ece00e3136cf7dfdeeeff2bb7 Author: Colin Okay <okay@toyful.space> Date: Tue Mar 15 15:45:20 2022 -0500 bugfix: handle user interrupt in new and edit commit 130ae266f51f63ac423a65b17749a4d38dda1018 Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 19:36:18 2022 -0500 Added a --verbose / -v option to RUN commit 67c793633bfcd46997155341dd4b1776fb6a6728 Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 19:19:24 2022 -0500 Added help topic explaining icons in printouts commit 08fd723502bb3ee021911c0c9db0f743b575ad68 Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 19:06:36 2022 -0500 Added variables help topic commit 3c8b1804a7e520f465ced563bbf9b416b4abb8ab Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 19:00:54 2022 -0500 added EDITOR CONFIGURATION help topic commit 6dd2563a0f2b848e84f297a0a2296756c65f6246 Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 14:22:09 2022 -0500 made the note while hacking comment more visible commit 1a1de0bb8c18798064d103b70a1c06d20eb3ad05 Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 08:48:50 2022 -0500 moved host assertion inside handler-case commit e2091250cbc8dce679b52636647949d0b417e6be Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 08:21:12 2022 -0500 CONTRIBUTING rewording commit 86f7cdb2ce0f99aee0328617999f35b63694b4a6 Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 08:15:27 2022 -0500 argument checking for run and clip commit f18dddd766af9e06ba4f66487701322de495de59 Author: Colin Okay <okay@toyful.space> Date: Mon Mar 14 08:11:58 2022 -0500 tweaks to help menu printing commit 4b390fcde69013393bae325be2e8d2f5944cd15b Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 22:23:46 2022 -0500 tabulating help menu command listing commit 57bae08a8b9accc1d4bfb7165080e7d5a5ef2a30 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 17:40:45 2022 -0500 deletion support; some cache syncing in client functions; commit 7a97e9d6ba5737f1088dd3a81b9b16121cf47c39 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 14:45:28 2022 -0500 only print drafts when *drafts* is non null commit 6890b0349f79c0fbbbe5b8b7b3dbf8c2d2262e79 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 14:43:59 2022 -0500 better printing of drafts commit 6a6c2ec8e2ef6cc9fa91f769d7dbe79387529619 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 14:39:55 2022 -0500 printing drafts commit 8ba6552132fab6daef1f2b10adf932c87947e2ec Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 14:31:12 2022 -0500 can run the edit command on drafts with --redraft commit 5531288c433641d81d1359e0afa69f86d4bf5d07 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 14:24:16 2022 -0500 can also edit drafts commit 7bcf634c789c00a95237ad74e5f923a4214020c8 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 14:21:33 2022 -0500 can make, run, and publish drafts commit 7ae6cbff1875ea271fa1724d6e53bc3d3d48dd26 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 13:56:49 2022 -0500 support for running drafts; drafts accounted for in with-local-state commit 07183b5bbb4d2e65514e3ec3e7cdf7e421f97749 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 11:57:06 2022 -0500 added intial drafting code to new commit 80bf9816c6e35bf7ffcc1e4349d5abf056c4df7f Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 11:22:21 2022 -0500 updating helptexts; drafts-file function commit b5b0204d6742c68a90a6388593b980864ae301c3 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 10:58:19 2022 -0500 removed old main commit 3236933be611f91183ea6b61890c7fbd0b892d8b Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 10:57:54 2022 -0500 removed spurious function commit 3a412cda20b45a2e6617d43e66c6c006924dad88 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 10:57:05 2022 -0500 cosmetic change to command section printout commit 82a0911f93760a0059addc056340733f8797ae91 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 10:46:41 2022 -0500 new main in app.lisp; exports to oneliners.cli package commit ebc79c386d4db262ae76bb2ba0386460a35648f9 Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 10:17:18 2022 -0500 tweaks to synopsis definition commit f39523d713c538f81d6f0cdc056fa750ae8a257e Author: Colin Okay <okay@toyful.space> Date: Sun Mar 13 09:58:09 2022 -0500 rewrote clon synopsis form
Diffstat (limited to 'lib/state.lisp')
-rw-r--r--lib/state.lisp90
1 files changed, 64 insertions, 26 deletions
diff --git a/lib/state.lisp b/lib/state.lisp
index 0f69ff3..5ca5a7b 100644
--- a/lib/state.lisp
+++ b/lib/state.lisp
@@ -25,7 +25,7 @@
(host "")
(shell "bash"))
-;;; DYNAMIC VARS FOR CONFIG AND CACHE, AND SOME GETTERS
+;;; CONFIG VAR AND OPERATIONS
(defvar *config* nil
"Holds a config struct instance.")
@@ -50,9 +50,58 @@
(defun shell ()
(config-shell *config*))
+
+;;; CACHE VAR AND OPERATIONS
+
(defvar *cache* nil
"Holds cached oneliners as a list.")
+(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))
+
+(defun remove-from-cache (id-or-name)
+ "Removes an item from the contents of *cache*."
+ (a:when-let (found (get-cached id-or-name))
+ (setf *cache* (delete found *cache*))))
+
+;;; DRAFTS VAR AND OPERATIONS
+
+(defvar *drafts* nil
+ "Holds a list of oneliner drafts yet to be sent to the server.")
+
+(defun fetch-draft (name)
+ "Fetch a draft by name form the *DRAFTS* association list."
+ (cdr (assoc name *drafts* :test #'string-equal)))
+
+(defun drop-draft (name)
+ "Drop a draft by NAME from the *DFRAFTS* association list."
+ (setf *DRAFTS* (delete (assoc name *DRAFTS* :test #'string-equal) *DRAFTS*)))
+
+(defun put-draft (name draft)
+ "Modifies *DRAFTS*, adding a new DRAFT associated with NAME. If NAME
+is already associated, that old association is deleted."
+ (drop-draft name)
+ (push (cons name draft) *drafts*))
+
;;; LOADING AND SAVING STATE
(defun config-file ()
@@ -63,6 +112,10 @@
"Returns the pathname holding the location of the cache."
(merge-pathnames ".cache/oneliners.cache" (user-homedir-pathname)))
+(defun drafts-file ()
+ "Returns the pathame holding the location of the oneliner drafts file."
+ (merge-pathnames ".cache/oneliners.drafts" (user-homedir-pathname)))
+
(defun wipe-cache ()
"Deletes the cache, if present."
(uiop:delete-file-if-exists (cached-oneliners-file)))
@@ -94,6 +147,12 @@ CACHED-ONELINERS-FILE. NIL if there is no such file."
:shell (prompt "With which shell should oneliners be run? "
:prefill "bash")))
+(defun read-drafts-file ()
+ (read-from-file (drafts-file)))
+
+(defun write-drafts-to-disk ()
+ (print-to-file *drafts* (drafts-file)))
+
(defun ensure-config ()
"Ensures that a configuration file exists on disk, prompting the
user for some input if it does not."
@@ -101,29 +160,6 @@ user for some input if it does not."
(read-config-file)
(make-fresh-config)))
-;;; 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))
;;; STATE LOADING MACRO
@@ -132,13 +168,15 @@ user for some input if it does not."
sets the api's *host* variable. If BODY produces no errors, the "
`(let* ((*config* (ensure-config))
(*cache* (read-cache-file))
+ (*drafts* (read-drafts-file))
(api:*host* (config-host *config*)))
- (assert api:*host* () "ol must be configured with a server host.")
- (set-term-width)
(handler-case
(progn
+ (assert api:*host* () "ol must be configured with a server host.")
+ (set-term-width)
,@body
;; only if there is no error do we save the local state.
+ (write-drafts-to-disk)
(write-cache-to-disk)
(write-config-to-disk))
(error (e)