{-# LANGUAGE OverloadedStrings #-} module Parse.Code where import Data.Code import Parse.Util import Data.Yaml import Data.Maybe (catMaybes) parseCode :: Value -> Parser [CodePart] parseCode (Object v) = fmap catMaybes . sequenceA $ [ fmap Rows' <$> v .:? "cell_rows_bottom" , fmap Cols <$> v .:? "cell_cols" , fmap RowsN' <$> v .:? "node_rows_bottom" , fmap ColsN <$> v .:? "node_cols" , fmap (LabelsN . fmap (fmap unAlpha . blankToMaybe)) <$> (do v' <- v .:? "node_labels" sequenceA (parseGrid <$> v')) , fmap LRows' <$> (v .:? "cell_rows_bottom_labeled" >>= traverse parseCharMap) , fmap LCols <$> (v .:? "cell_cols_labeled" >>= traverse parseCharMap) , fmap LRowsN' <$> (v .:? "node_rows_bottom_labeled" >>= traverse parseCharMap) , fmap LColsN <$> (v .:? "node_cols_labeled" >>= traverse parseCharMap) ] parseCode _ = fail "expected object"