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 mfa-tool.aws-dispatcher:update-stacks))
  (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 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)))))