module Network.NNTP.ParserHelpers
(
code,
integer,
iD,
groupName,
text,
line
)
where
import Control.Applicative
import Control.Monad.Error
import Data.ByteString.Lazy.Char8 hiding (replicate)
import Network.NNTP.Internal hiding (groupName)
import Text.Parsec hiding ((<|>))
code :: Monad m => NntpParser m Int
code = (\p -> case p of
400 -> line *> lift (NntpT (throwError ServiceDiscontinued))
500 -> line *> lift (NntpT (throwError NoSuchCommand))
_ -> return p) =<< read <$> sequence (replicate 3 digit)
integer :: Monad m => NntpParser m Integer
integer = read <$> many1 digit
iD :: Monad m => NntpParser m String
iD = (('<':) . (++">")) <$> (string "<" *> many1 (noneOf ">") <* string ">")
groupName :: Monad m => NntpParser m String
groupName = (alphaNum <|> oneOf ".-_+!#@=") `manyTill` lookAhead space
text :: Monad m => NntpParser m ByteString
text = pack <$> (anyChar `manyTill` try (string "\r\n.\r\n"))
line :: Monad m => NntpParser m ByteString
line = pack <$> (anyChar `manyTill` try (string "\r\n"))