 (require 'eieio)
 (require 'pcase)
 (require 'rx)
+(require 'subr-x)
 
  

This class is abstract; use ‘elisp/runfiles/make’ to create
instances or ‘elisp/runfiles/get’ access a global instance.")

(cl-defun elisp/runfiles/make (&key (manifest (getenv "RUNFILES_MANIFEST_FILE"))
                                    (directory (getenv "RUNFILES_DIR")))
  "Return a new instance of a subclass of ‘elisp/runfiles/runfiles’.
MANIFEST and DIRECTORY specify the location of the runfiles.  By
default, use environmental variable to find the runfiles.

an error of type ‘elisp/runfiles/not-found’."
  (cl-check-type manifest (or null string))
  (cl-check-type directory (or null string))
  (unless manifest
    (let ((value (getenv "RUNFILES_MANIFEST_FILE")))
      (and value (not (string-empty-p value))
           (setq manifest (concat "/:" value)))))
  (unless directory
    (let ((value (getenv "RUNFILES_DIR")))
      (and value (not (string-empty-p value))
           (setq directory (concat "/:" value)))))
  (or (and manifest (not (string-equal manifest ""))
           (file-regular-p manifest)
           (file-readable-p manifest)
