Function: dape--config-from-string
dape--config-from-string is a natively compiled function defined in
dape.el.
Signature
(dape--config-from-string STR)
Documentation
Return list of (KEY CONFIG) from STR.
Expects STR format:
”ALIST-KEY KEY VALUE ... - ENV= PROGRAM ARG ...”
Where ALIST-KEY exists in dape-configs.
Source Code
;; Defined in /nix/store/1fiaif8pifqj2jh65rbg3fkhg3i56q42-emacs-packages-deps/share/emacs/site-lisp/elpa/dape-0.27.1/dape.el
(defun dape--config-from-string (str)
"Return list of (KEY CONFIG) from STR.
Expects STR format:
\”ALIST-KEY KEY VALUE ... - ENV= PROGRAM ARG ...\”
Where ALIST-KEY exists in `dape-configs'."
(let ((buffer (current-buffer))
name read-config base-config)
(with-temp-buffer
;; Keep possible local `dape-configs' value
(setq-local dape-configs
(buffer-local-value 'dape-configs buffer))
(insert str)
(goto-char (point-min))
(unless (setq name (ignore-errors (read (current-buffer))))
(user-error "Expects config name (%s)"
(mapconcat (lambda (e) (symbol-name (car e)))
dape-configs ", ")))
(unless (alist-get name dape-configs)
(user-error "No configuration named `%s'" name))
(setq base-config (copy-tree (alist-get name dape-configs)))
(ignore-errors
(while
;; Do we have non whitespace chars after `point'?
(thread-first (buffer-substring (point) (point-max))
(string-trim)
(string-empty-p)
(not))
(let ((thing (read (current-buffer))))
(cond
((eq thing '-)
(unless (dape--plistp read-config)
(user-error "Expecting complete options list before `-'"))
(cl-loop
with command = (split-string-shell-command
(buffer-substring (point) (point-max)))
with setvar = "\\`\\([A-Za-z_][A-Za-z0-9_]*\\)=\\(.*\\)\\'"
for cell on command for (program . args) = cell
when (string-match setvar program)
append `(,(intern (concat ":" (match-string 1 program)))
,(match-string 2 program))
into env and do (setq program nil)
when (or (and (not program) (not args)) program) do
(setq read-config
(append (nreverse
(append (when program `(:program ,program))
(when args `(:args ,(apply #'vector args)))
(when env `(:env ,env))))
read-config))
;; Stop and eat rest of buffer
and return (goto-char (point-max))))
(t
(push thing read-config))))))
;; Balance half baked options list
(when (not (dape--plistp read-config))
(pop read-config))
(unless (dape--plistp read-config)
(user-error "Bad options format, see `dape-configs'"))
(setq read-config (nreverse read-config))
;; Apply properties from parsed PLIST to `dape-configs' item
(cl-loop for (key value) on base-config by 'cddr
unless (plist-member read-config key) do
(setq read-config (plist-put read-config key value)))
(list name read-config))))