{-|
Description:    Central directory for tokenization rules.

Copyright:      (c) 2020 Sam May
License:        MPL-2.0
Maintainer:     ag.eitilt@gmail.com

Stability:      stable
Portability:    portable
-}
module Web.Mangrove.Parse.Tokenize.Dispatcher
    ( dispatcher
    ) where


import qualified Control.Monad.Trans.State as N.S

import Web.Mangrove.Parse.Tokenize.CData
import Web.Mangrove.Parse.Tokenize.Common
import Web.Mangrove.Parse.Tokenize.Data
import Web.Mangrove.Parse.Tokenize.RawText
import Web.Mangrove.Parse.Tokenize.RCData
import Web.Mangrove.Parse.Tokenize.PlainText
import Web.Mangrove.Parse.Tokenize.ScriptData
import Web.Mangrove.Parse.Tokenize.ScriptDataEscaped
import Web.Mangrove.Parse.Tokenize.ScriptDataDoubleEscaped


-- | Delegate parsing the binary stream to the appropriate part of the finite
-- state machine, according to the top-level 'CurrentTokenizerState'.
dispatcher :: Tokenizer [TokenizerOutput Token]
dispatcher :: Tokenizer [TokenizerOutput Token]
dispatcher = do
    TokenParserState
state <- StateT TokenParserState (Parser [TokenizerInput]) TokenParserState
forall (m :: * -> *) s. Monad m => StateT s m s
N.S.get
    case TokenParserState -> CurrentTokenizerState
currentState TokenParserState
state of
        CurrentTokenizerState
DataState -> Tokenizer [TokenizerOutput Token]
tokenData
        CurrentTokenizerState
RCDataState -> Tokenizer [TokenizerOutput Token]
tokenRCData
        CurrentTokenizerState
RawTextState -> Tokenizer [TokenizerOutput Token]
tokenRawText
        CurrentTokenizerState
PlainTextState -> (TokenizerOutput Token -> [TokenizerOutput Token])
-> StateT
     TokenParserState (Parser [TokenizerInput]) (TokenizerOutput Token)
-> Tokenizer [TokenizerOutput Token]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (TokenizerOutput Token
-> [TokenizerOutput Token] -> [TokenizerOutput Token]
forall a. a -> [a] -> [a]
: []) StateT
  TokenParserState (Parser [TokenizerInput]) (TokenizerOutput Token)
tokenPlainText
        CurrentTokenizerState
ScriptDataState -> Tokenizer [TokenizerOutput Token]
tokenScriptData
        CurrentTokenizerState
ScriptDataEscapedState -> Tokenizer [TokenizerOutput Token]
tokenScriptDataEscaped
        CurrentTokenizerState
ScriptDataDoubleEscapedState -> Tokenizer [TokenizerOutput Token]
tokenScriptDataDoubleEscaped
        CurrentTokenizerState
CDataState -> Tokenizer [TokenizerOutput Token]
tokenCDataSection