git.fiddlerwoaroof.com
Raw Blame History
(defpackage :mfa-tool.stack-store
  (:use :cl)
  (:export #:stack-store #:available-stacks selected-stack parameters outputs))
(in-package :mfa-tool.stack-store)

(defun column (key)
  (serapeum:op (serapeum:assocadr key _
                                  :test 'equal)))

(defclass stack-store (mfa-tool.store:store mfa-tool.aws-dispatcher:aws-dispatcher)
  ((%available-stacks :accessor available-stacks :initform nil)
   (%selected-stack :accessor selected-stack :initform nil)
   (%parameters :accessor parameters :initform nil)
   (%outputs :accessor outputs :initform nil)))


(defun output-columns (output)
  (funcall (data-lens:juxt (column "OutputKey")
                           (column "OutputValue"))
           output))

(defun parameter-columns (output)
  (funcall (data-lens:juxt (column "ParameterKey")
                           (column "ParameterValue"))
           output))

(defmethod mfa-tool.store:dispatch :after ((store stack-store)
                                           (action (eql :refresh)))
  (mfa-tool.store:dispatch store
                           (mfa-tool.aws-dispatcher:refresh-stack
                            (mfa-tool.stack-store:selected-stack
                             store))))

(defmethod mfa-tool.store:dispatch :after ((store stack-store)
                                           (action mfa-tool.aws-dispatcher:put-stack))
  (let* ((stack (mfa-tool.aws-dispatcher:stack action))
         (old-stack (find (daydreamer.aws-result:stack-name stack)
                          (available-stacks store)
                          :key 'daydreamer.aws-result:stack-name
                          :test 'equal))
         (new-stacks (substitute stack old-stack (available-stacks store))))
    (mfa-tool.store:dispatch store (mfa-tool.aws-dispatcher:select-stack stack))
    (mfa-tool.store:dispatch store (mfa-tool.aws-dispatcher:update-stacks new-stacks))))

(defmethod mfa-tool.store:dispatch :after ((store stack-store)
                                           (action mfa-tool.aws-dispatcher:update-stacks))
  (when (not (selected-stack store))
    (alexandria:when-let ((stack (car (mfa-tool.aws-dispatcher:stacks action))))
      (mfa-tool.store:dispatch store (mfa-tool.aws-dispatcher:select-stack stack)))))

(defmethod mfa-tool.store:execute ((store stack-store) (action (eql :refresh)))
  )

(defmethod mfa-tool.store:execute ((store stack-store) (action mfa-tool.aws-dispatcher:update-stacks))
  (setf (available-stacks store) (sort (mfa-tool.aws-dispatcher:stacks action)
                                       'string-lessp
                                       :key 'daydreamer.aws-result:stack-name)))

(defmethod mfa-tool.store:execute ((store stack-store) (action mfa-tool.aws-dispatcher:select-stack))
  (let ((stack (mfa-tool.aws-dispatcher:stack action)))
    (setf (selected-stack store) stack

          (parameters store) (mapcar 'parameter-columns (daydreamer.aws-result:parameters stack))

          (outputs store) (mapcar 'output-columns (daydreamer.aws-result:outputs stack)))))

(defmethod mfa-tool.store:execute ((store stack-store) (action mfa-tool.aws-dispatcher:put-stack))
  )