diff options
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/nix-mode-20180908.2240/nix-instantiate.el')
-rw-r--r-- | configs/shared/emacs/.emacs.d/elpa/nix-mode-20180908.2240/nix-instantiate.el | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/nix-mode-20180908.2240/nix-instantiate.el b/configs/shared/emacs/.emacs.d/elpa/nix-mode-20180908.2240/nix-instantiate.el new file mode 100644 index 000000000000..899ec9790b79 --- /dev/null +++ b/configs/shared/emacs/.emacs.d/elpa/nix-mode-20180908.2240/nix-instantiate.el @@ -0,0 +1,104 @@ +;;; nix-instantiate.el -- run nix commands in Emacs -*- lexical-binding: t -*- + +;; Author: Matthew Bauer <mjbauer95@gmail.com> +;; Homepage: https://github.com/NixOS/nix-mode +;; Keywords: nix + +;; This file is NOT part of GNU Emacs. + +;;; Commentary: + +;;; Code: + +(require 'nix) +(require 'json) + +(defun nix-instantiate--parsed (drv) + "Get the parsed version of the .drv file. +DRV file to load from." + (let ((stdout (generate-new-buffer "nix show-derivation")) + result) + (call-process nix-executable nil (list stdout nil) nil + "show-derivation" drv) + (setq result + (cdar (with-current-buffer stdout + (when (eq (buffer-size) 0) + (error "Nix’s show-derivation %s failed to produce any output" + drv)) + (goto-char (point-min)) + (json-read)))) + (kill-buffer stdout) + result)) + +(defun nix-instantiate (nix-file &optional attribute parse) + "Run nix-instantiate on a Nix expression. +NIX-FILE the file to instantiate. +ATTRIBUTE an attribute of the Nix file to use. +PARSE whether to parse nix-instantiate output." + (interactive (list (read-file-name "Nix file: ") nil t)) + + (let ((stdout (generate-new-buffer "nix-instantiate")) + result) + (if attribute + (call-process nix-instantiate-executable nil (list stdout nil) nil + nix-file "-A" attribute) + (call-process nix-instantiate-executable nil (list stdout nil) nil + nix-file)) + (with-current-buffer stdout + (when (eq (buffer-size) 0) + (error + "Error: nix-instantiate %s failed to produce any output" + nix-file)) + (setq result (substring (buffer-string) 0 (- (buffer-size) 1))) + (when parse + (setq result (nix-instantiate--parsed result)))) + (kill-buffer stdout) + result)) + +(defvar nix-instantiate--running-processes nil) + +(defun nix-instantiate--sentinel (prop err proc event) + "Make a nix-instantiate process. +PROP the prop name of nix-instantiate--running-processes. +ERR the error buffer. +PROC the process that has been run. +EVENT the event that was fired." + (when (string= event "finished\n") + (with-current-buffer (process-buffer proc) + (unless (eq (buffer-size) 0) + (let ((drv (nix-instantiate--parsed + (substring (buffer-string) 0 (- (buffer-size) 1))))) + (dolist + (callback (lax-plist-get nix-instantiate--running-processes prop)) + (funcall callback drv))))) + (setq nix-instantiate--running-processes + (lax-plist-put nix-instantiate--running-processes prop nil))) + (unless (process-live-p proc) + (kill-buffer (process-buffer proc)) + (kill-buffer err))) + +(defun nix-instantiate-async (callback nix-file &optional attribute) + "Run nix-instantiate on a Nix expression, asynchronously. +CALLBACK the function to call when instantiate completes. +NIX-FILE the file to instantiate +ATTRIBUTE an attribute of the Nix file to use." + (setq nix-file (expand-file-name nix-file)) + (let* ((prop (if attribute + (expand-file-name attribute nix-file) nix-file)) + (data (lax-plist-get nix-instantiate--running-processes prop)) + (stdout (generate-new-buffer "nix-instantiate")) + (stderr (generate-new-buffer "nix-instantiate error"))) + (setq nix-instantiate--running-processes + (lax-plist-put nix-instantiate--running-processes + prop (cons callback data))) + (make-process + :name "nix-instantiate" + :buffer stdout + :command (append (list nix-instantiate-executable nix-file) + (when attribute (list "-A" attribute))) + :noquery t + :sentinel (apply-partially 'nix-instantiate--sentinel prop stderr) + :stderr stderr))) + +(provide 'nix-instantiate) +;;; nix-instantiate.el ends here |