module Graphics.Formats.STL.Parser where
import Prelude hiding (takeWhile)
import Control.Applicative
import Data.Attoparsec.Text
import Data.Text (Text)
import Graphics.Formats.STL.Types
stlParser :: Parser STL
stlParser = STL <$> nameParser <*> many' triangle
nameParser :: Parser Text
nameParser = text "solid" *> takeWhile (inClass " -~") <* skipSpace
triangle = Triangle <$> ss normalParser <*> loop <* text "endfacet"
loop = triple <$> (text "outer loop" *> ss vertex) <*> ss vertex <*> ss vertex <* text "endloop"
normalParser :: Parser Vector
normalParser = text "facet" *> text "normal" *> v3
vertex :: Parser Vector
vertex = text "vertex" *> v3
v3 :: Parser Vector
v3 = triple <$> ss double <*> ss double <*> ss double
ss :: Parser a -> Parser a
ss p = p <* skipSpace
text :: Text -> Parser Text
text t = string t <* skipSpace