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

import Control.Applicative

import Data.ByteString (ByteString)
import Data.UUID
import Data.Attoparsec.ByteString.Char8 as A

import Data.ZRE (mkGroup)
import Network.ZRE.Types

parseAttoApi :: 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 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 =
      Group -> API
DoJoin (Group -> API) -> (ByteString -> Group) -> ByteString -> API
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Group
mkGroup  (ByteString -> API) -> Parser ByteString ByteString -> Parser API
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string ByteString
"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
<|> Group -> API
DoLeave (Group -> API) -> (ByteString -> Group) -> ByteString -> API
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Group
mkGroup (ByteString -> API) -> Parser ByteString ByteString -> Parser API
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string ByteString
"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
<|> Group -> ByteString -> API
DoShout (Group -> ByteString -> API)
-> Parser ByteString Group -> Parser ByteString (ByteString -> API)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ByteString -> Parser ByteString ByteString
string ByteString
"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 Group -> Parser ByteString Group
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (ByteString -> Group
mkGroup (ByteString -> Group)
-> Parser ByteString ByteString -> Parser ByteString Group
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> 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 ByteString
"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 ByteString
"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 ByteString
"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 ByteString
"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 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
==Char
' ')

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

--uEOL :: Parser 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
        Maybe UUID
Nothing -> String -> Parser ByteString UUID
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"no uuid"
        Just UUID
x -> UUID -> Parser ByteString UUID
forall (m :: * -> *) a. Monad m => a -> m a
return UUID
x