-- |
-- Module      : Text.LDAP.InternalParser
-- Copyright   : 2014 Kei Hibino
-- License     : BSD3
--
-- Maintainer  : ex8k.hibino@gmail.com
-- Stability   : experimental
-- Portability : unknown
--
-- Module of internal share parsers.
module Text.LDAP.InternalParser
       ( LdapParser
       , satisfyW8

       , ldifSafeString
       ) where

import Control.Applicative ((<$>), (<*>), many)
import Data.Word (Word8)
import Data.ByteString (ByteString, pack)
import Data.Attoparsec.ByteString.Char8 (Parser, satisfy)

import Text.LDAP.Data (ordW8, inBounds)
import qualified Text.LDAP.Data as Data


type LdapParser = Parser

satisfyW8 :: (Char -> Bool) -> LdapParser Word8
satisfyW8 :: (Char -> Bool) -> LdapParser Word8
satisfyW8 =  (Char -> Word8
ordW8 (Char -> Word8) -> Parser ByteString Char -> LdapParser Word8
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (Parser ByteString Char -> LdapParser Word8)
-> ((Char -> Bool) -> Parser ByteString Char)
-> (Char -> Bool)
-> LdapParser Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> Parser ByteString Char
satisfy

ldifSafeString :: LdapParser ByteString
ldifSafeString :: LdapParser ByteString
ldifSafeString =
  ([Word8] -> ByteString
pack ([Word8] -> ByteString)
-> Parser ByteString [Word8] -> LdapParser ByteString
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>)
  (Parser ByteString [Word8] -> LdapParser ByteString)
-> Parser ByteString [Word8] -> LdapParser ByteString
forall a b. (a -> b) -> a -> b
$ (:)
  (Word8 -> [Word8] -> [Word8])
-> LdapParser Word8 -> Parser ByteString ([Word8] -> [Word8])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Char -> Bool) -> LdapParser Word8
satisfyW8 (Char -> [(Char, Char)] -> Bool
forall a. (Enum a, Ord a) => a -> [(a, a)] -> Bool
`inBounds` [(Char, Char)]
Data.ldifSafeInitBounds)
  Parser ByteString ([Word8] -> [Word8])
-> Parser ByteString [Word8] -> Parser ByteString [Word8]
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> LdapParser Word8 -> Parser ByteString [Word8]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many ((Char -> Bool) -> LdapParser Word8
satisfyW8 (Char -> [(Char, Char)] -> Bool
forall a. (Enum a, Ord a) => a -> [(a, a)] -> Bool
`inBounds` [(Char, Char)]
Data.ldifSafeBounds))