-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdelfos-dialogue.el
More file actions
68 lines (57 loc) · 2.37 KB
/
delfos-dialogue.el
File metadata and controls
68 lines (57 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
;;; delfos-dialogue.el --- Description -*- lexical-binding: t; -*-
;;
;; Copyright (C) 2023 namespace
;;
;; Author: namespace <src.namespace@gmail.com>
;; Maintainer: namespace <src.namespace@gmail.com>
;;; Commentary:
;; This library defines functions that implement the chat-like flow, bridging the
;; the gap between the user input, the delfos buffer and the delfos modus.
;;; Code:
(require 'cl-lib)
(require 'delfos-message)
(require 'delfos-modus)
(require 'delfos-thread)
(require 'delfos-buffer)
(require 'delfos-feedback)
(defun delfos-dialogue-on-send (msg thread-name)
(delfos-thread-with
thread-name
(let ((buffer-focused-p (equal (current-buffer) (window-buffer (selected-window)))))
(delfos-buffer-render-message msg)
(when buffer-focused-p
(delfos-feedback-show-spinner)))))
(defun delfos-dialogue-on-receive (answer thread-name)
(delfos-thread-with
thread-name
(delfos-buffer-render-message answer)
(delfos-feedback-play-bell)
(delfos-feedback-hide-spinner)))
(cl-defun delfos-dialogue-send (handler msg thread-name &rest kwargs)
"Manage query MSG feedback/render while executing delfos-mode FUNCTION."
(unless (delfos-message-p msg)
(error "MSG must be a delfos-message"))
(let* ((input-callback (plist-get kwargs :callback))
(query-callback (lambda (answer)
(delfos-dialogue-on-receive answer thread-name)
(when input-callback
(funcall input-callback answer))))
(updated-kwargs (plist-put kwargs :callback query-callback)))
(delfos-dialogue-on-send msg thread-name)
(apply handler msg updated-kwargs)))
(defun delfos-dialogue-send-from-buffer (msg)
(let* ((modus (delfos-modus-get (delfos-buffer-get-modus)))
(kwargs (funcall (delfos-modus-get-config-from-buffer modus)))
(handler (delfos-modus-process-question modus))
(thread-name (delfos-buffer-get-title)))
(apply #'delfos-dialogue-send handler msg thread-name kwargs)))
(defun delfos-dialogue-input (text)
(interactive "sYour message: ")
(cl-assert (eq major-mode 'delfos-mode))
(delfos-dialogue-send-from-buffer (make-delfos-message-user :content text)))
(defun delfos-dialogue-input-from-buffer ()
(interactive)
(let ((text (delfos-input-buffer)))
(delfos-dialogue-input text)))
(provide 'delfos-dialogue)
;;; delfos-dialogue.el ends here