about summary refs log tree commit diff
path: root/users/wpcarro/emacs/.emacs.d/wpc/timestring.el
;;; timestring.el --- Quickly access timestamps in different formats -*- lexical-binding: t -*-

;; Author: William Carroll <wpcarro@gmail.com>
;; Version: 0.0.1
;; URL: https://git.wpcarro.dev/wpcarro/briefcase
;; Package-Requires: ((emacs "25.1"))

;;; Commentary:

;; I was making some API calls where a URL needed a `since` parameter that of an
;; RFC 3339 encoded string.
;;
;; Because I didn't know what a RFC 3339 encoded
;; string was at the time, and because I didn't know what its format was
;; according to strftime, and because I'm most likely to forget both of these
;; things by the next time that I need something similar, I decided to write
;; this package so that I can accumulate a list of common time encodings.
;;
;; Thank you, Emacs.
;;
;; p.s. - I may turn this into a proper module and publish it.  But not today.

;;; Code:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Dependencies
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(require 'ts)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Library
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(defgroup timestring nil
  "Customize group for timestring configuration.")

(defcustom timestring-supported-encodings
  '(("RFC 3339" . "%Y-%m-%dT%H:%M:%SZ")
    ;; Does anyone recognize this format?
    ("IDK" . "%Y-%m-%d %H:%M:%S %z"))
  "Mapping of encoding names to their format strings."
  :group 'timestring)

(defcustom timestring-supported-times
  '(("yesterday" . timestring--yesterday)
    ("now" . ts-now)
    ("tomorrow" . timestring--tomorrow))
  "Mapping of a labels to the functions that create those time objects."
  :group 'timestring)

(defun timestring--yesterday ()
  "Return a time object for yesterday."
  (ts-adjust 'day -1 (ts-now)))

(defun timestring--tomorrow ()
  "Return a time object for yesterday."
  (ts-adjust 'day +1 (ts-now)))

(defun timestring--completing-read (label xs)
  "Call `completing-read' with LABEL over the collection XS."
  (alist-get (completing-read label xs) xs nil nil #'equal))

(defun timestring-copy-encoded-time ()
  "Select a common time and an encoding.

The selected time will be encoded using the selected encoding and copied onto
your clipboard."
  (interactive)
  (let ((time (funcall (timestring--completing-read
                        "Time: " timestring-supported-times)))
        (fmt (timestring--completing-read
              "Encoding: " timestring-supported-encodings)))
    (kill-new (ts-format fmt time))
    (message "Copied!")))

(provide 'timestring)
;;; timestring.el ends here