{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Network.ZRE.Parse (parseApi, parseAttoApi) where

import Control.Applicative

import Data.UUID
import Data.Attoparsec.ByteString.Char8 as A
import qualified Data.ByteString.Char8 as B

import Network.ZRE.Types

parseAttoApi :: B.ByteString -> Either String API
parseAttoApi :: ByteString -> Either String API
parseAttoApi = Parser API -> ByteString -> Either String API
forall a. Parser a -> ByteString -> Either String a
A.parseOnly Parser API
parseApi

parseApi :: Parser API
parseApi :: Parser API
parseApi = do
  Parser API
parseControl

parseControl :: Parser API
parseControl :: Parser API
parseControl = Char -> Parser Char
char '/' Parser Char -> Parser API -> Parser API
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser API
parseCmd

parseCmd :: Parser API
parseCmd :: Parser API
parseCmd =
      ByteString -> API
DoJoin (ByteString -> API) -> Parser ByteString ByteString -> Parser API
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string "join" Parser ByteString ByteString
-> Parser ByteString () -> Parser ByteString ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString ()
lskip Parser ByteString ()
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString ByteString
word)
  Parser API -> Parser API -> Parser API
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString -> API
DoLeave (ByteString -> API) -> Parser ByteString ByteString -> Parser API
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string "leave" Parser ByteString ByteString
-> Parser ByteString () -> Parser ByteString ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString ()
lskip Parser ByteString ()
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString ByteString
word)
  Parser API -> Parser API -> Parser API
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ByteString -> ByteString -> API
DoShout (ByteString -> ByteString -> API)
-> Parser ByteString ByteString
-> Parser ByteString (ByteString -> API)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string "shout" Parser ByteString ByteString
-> Parser ByteString () -> Parser ByteString ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString ()
lskip Parser ByteString ()
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString ByteString
word) Parser ByteString (ByteString -> API)
-> Parser ByteString ByteString -> Parser API
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (Parser ByteString ()
lskip Parser ByteString ()
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString ByteString
word)
  Parser API -> Parser API -> Parser API
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> UUID -> ByteString -> API
DoWhisper (UUID -> ByteString -> API)
-> Parser ByteString UUID -> Parser ByteString (ByteString -> API)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string "whisper" Parser ByteString ByteString
-> Parser ByteString UUID -> Parser ByteString UUID
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString UUID
uuid) Parser ByteString (ByteString -> API)
-> Parser ByteString ByteString -> Parser API
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser ByteString ByteString
lw
  Parser API -> Parser API -> Parser API
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> API
DoDebug (Bool -> API) -> Parser ByteString Bool -> Parser API
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string "debug" Parser ByteString ByteString
-> Parser ByteString Bool -> Parser ByteString Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> Parser ByteString Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True)
  Parser API -> Parser API -> Parser API
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> API
DoDebug (Bool -> API) -> Parser ByteString Bool -> Parser API
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string "nodebug" Parser ByteString ByteString
-> Parser ByteString Bool -> Parser ByteString Bool
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Bool -> Parser ByteString Bool
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False)
  Parser API -> Parser API -> Parser API
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (ByteString -> Parser ByteString ByteString
string "quit" Parser ByteString ByteString -> Parser API -> Parser API
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> API -> Parser API
forall (f :: * -> *) a. Applicative f => a -> f a
pure API
DoQuit)

lw :: Parser B.ByteString
lw :: Parser ByteString ByteString
lw = Parser ByteString ()
lskip Parser ByteString ()
-> Parser ByteString ByteString -> Parser ByteString ByteString
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser ByteString ByteString
word

lskip :: Parser ()
lskip :: Parser ByteString ()
lskip = (Char -> Bool) -> Parser ByteString ()
skipWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==' ')

word :: Parser B.ByteString
word :: Parser ByteString ByteString
word = (Char -> Bool) -> Parser ByteString ByteString
A.takeWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=' ')

--uEOL :: Parser B.ByteString
--uEOL = A.takeTill (pure False)

uuid :: Parser UUID
uuid :: Parser ByteString UUID
uuid = do
  Maybe UUID
mx <- ByteString -> Maybe UUID
fromASCIIBytes (ByteString -> Maybe UUID)
-> Parser ByteString ByteString -> Parser ByteString (Maybe UUID)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser ByteString ByteString
lw
  case Maybe UUID
mx of
        Nothing -> String -> Parser ByteString UUID
forall (m :: * -> *) a. MonadFail m => String -> m a
fail "no uuid"
        Just x :: UUID
x -> UUID -> Parser ByteString UUID
forall (m :: * -> *) a. Monad m => a -> m a
return UUID
x