;;; TODO: ;;; - Error Checking (asdf:oos 'asdf:load-op :cxml) (asdf:oos 'asdf:load-op :xmls) (asdf:oos 'asdf:load-op :xmls-tools) (asdf:oos 'asdf:load-op :parse-number) (defpackage qbrew (:use common-lisp) (:use brew-db) (:use xmls-tools) (:use parse-number) (:export qbrewdata->brew-db)) (in-package qbrew) (defun read-recipe (file-path) (cxml:parse-file file-path (cxml:make-whitespace-normalizer (cxml-xmls:make-xmls-builder)) :validate nil)) (defun read-data (file-path) (cxml:parse-file file-path (cxml:make-whitespace-normalizer (cxml-xmls:make-xmls-builder)) :validate nil)) (defun parse-data (data) "Parse data read by read-data. Returns a list of brew-db: view objects" (let ((styles (mapcar #'(€ō¦¦†ėlambda (style) (make-instance 'style :name (car (last style)) ; this works but is evil :og-low (parse-number (get-attr-value "oglow" style)) :og-high (parse-number (get-attr-value "oghigh" style)) :fg-low (parse-number (get-attr-value "fglow" style)) :fg-high (parse-number (get-attr-value "fghigh" style)) :srm-low (parse-number (get-attr-value "srmlow" style)) :srm-high (parse-number (get-attr-value "srmhigh" style)) :ibu-low (parse-number (get-attr-value "ibulow" style)) :ibu-high (parse-number (get-attr-value "ibuhigh" style)))) (find-all-children (find-subtree data '("styles")) "style"))) (hops (mapcar #'(€ō¦¦†ėlambda (hop) (make-instance 'hop :alpha (float (parse-real-number (get-attr-value "alpha" hop))) :name (car (last hop)))) (find-all-children (find-subtree data '("hops")) "hop"))) (grains (mapcar #'(€ō¦¦†ėlambda (grain) (make-instance 'grain :extract (parse-number (get-attr-value "extract" grain)) :color (float (parse-real-number (get-attr-value "color" grain))) :use (string-downcase (get-attr-value "use" grain)) :name (car (last grain)))) (find-all-children (find-subtree data '("grains")) "grain"))) (yeast (delete-if #'not (mapcar #'(€ō¦¦†ėlambda (misc) (let ((notes (get-attr-value "notes" misc))) (cond ((or (string= notes "package") (string= notes "smack pack")) (make-instance 'yeast :name (car (last misc)))) (t nil)))) (find-all-children (find-subtree data '("miscingredients")) "miscingredient"))))) (list (cons :styles styles) (cons :hops hops) (cons :grains grains) (cons :yeast yeast)))) (defun qbrewdata->brew-db (file-path) "Parse qbrewdata and return a list of lists of styles, hops, grains, and yeast as brew-db: view objects" (parse-data (read-data file-path)))