module WURFLParser (
   parseTree
 , ParseError
 ) where
    
import Text.ParserCombinators.Parsec.Prim
import Text.ParserCombinators.Parsec.Error
import Data.Either
import Text.ParserCombinators.Parsec.Char
import Text.ParserCombinators.Parsec.Combinator
import WURFLTypes

    

userAgentEnd :: MD -> Parser MD
userAgentEnd r = do 
     manyTill anyToken eof
     return r
     
treeParser :: MD -> Tree MD -> Parser MD
treeParser o (Node a Nothing children) = do { string a
                                            ; r <- choice . reverse $ userAgentEnd o : map (treeParser o) children
                                            ; return r
                                            }
treeParser _ (Node a (Just v) []) = try $ do { string a
                                             ; return v
                                             }
                              
treeParser _ (Node a (Just v) children) = try $ do { string a
                                                   ; r <- choice . reverse $ userAgentEnd v : map (treeParser v) children
                                                   ; return r
                                                   }
  
parseTree :: [Tree MD] -> String -> Either ParseError MD                   
parseTree tree useragent = parse (choice (map (treeParser emptyMD) tree)) "" useragent