{-# LANGUAGE LambdaCase #-}
{-|
Module      : Text.Jira.Parser.Shared
Copyright   : © 2019–2023 Albert Krewinkel
License     : MIT

Maintainer  : Albert Krewinkel <tarleb@zeitkraut.de>
Stability   : alpha
Portability : portable

Parsers whch are shared between multiple modules.
-}
module Text.Jira.Parser.Shared
  ( icon
  , icon'
  , colorName
  ) where

import Data.Char (isLetter)
import Data.Text (Text)
import Text.Jira.Markup
import Text.Parsec

-- | Parses an icon
icon :: Parsec Text u Icon
icon :: forall u. Parsec Text u Icon
icon = forall u. Parsec Text u Icon
icon' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) t a u.
(Stream s m t, Show a) =>
ParsecT s u m a -> ParsecT s u m ()
notFollowedBy forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
alphaNum

-- | Like 'icon', but doesn't check whether the sequence is followed by
-- a character that would prevent the interpretation as an icon.
icon' :: Parsec Text u Icon
icon' :: forall u. Parsec Text u Icon
icon' = forall u. Parsec Text u Icon
smiley forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall u. Parsec Text u Icon
otherIcon

smiley :: Parsec Text u Icon
smiley :: forall u. Parsec Text u Icon
smiley = forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) t u a.
Stream s m t =>
[ParsecT s u m a] -> ParsecT s u m a
choice
  [ Icon
IconWinking forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall s (m :: * -> *) u.
Stream s m Char =>
[Char] -> ParsecT s u m [Char]
string [Char]
";)"
  , forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
':' forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
anyChar forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Char
'D' -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconSmiling
      Char
')' -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconSlightlySmiling
      Char
'(' -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconFrowning
      Char
'P' -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconTongue
      Char
c   -> forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char]
"unknown smiley: :" forall a. [a] -> [a] -> [a]
++ [Char
c])
  ]

otherIcon :: Parsec Text u Icon
otherIcon :: forall u. Parsec Text u Icon
otherIcon = forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try forall a b. (a -> b) -> a -> b
$ do
  let isIconChar :: Char -> Bool
isIconChar Char
c = Char -> Bool
isLetter Char
c Bool -> Bool -> Bool
|| (Char
c forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` ([Char]
"/!+-?*" :: String))
  [Char]
name <- forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'('
          forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 (forall s (m :: * -> *) u.
Stream s m Char =>
(Char -> Bool) -> ParsecT s u m Char
satisfy Char -> Bool
isIconChar)
          forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
')'
  case [Char]
name of
    [Char]
"y"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconThumbsUp
    [Char]
"n"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconThumbsDown
    [Char]
"i"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconInfo
    [Char]
"/"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconCheckmark
    [Char]
"x"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconX
    [Char]
"!"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconAttention
    [Char]
"+"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconPlus
    [Char]
"-"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconMinus
    [Char]
"?"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconQuestionmark
    [Char]
"on"      -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconOn
    [Char]
"off"     -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconOff
    [Char]
"*"       -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconStar
    [Char]
"*r"      -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconStarRed
    [Char]
"*g"      -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconStarGreen
    [Char]
"*b"      -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconStarBlue
    [Char]
"*y"      -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconStarYellow
    [Char]
"flag"    -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconFlag
    [Char]
"flagoff" -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Icon
IconFlagOff
    [Char]
_         -> forall (m :: * -> *) a. MonadFail m => [Char] -> m a
fail ([Char]
"not a known emoji" forall a. [a] -> [a] -> [a]
++ [Char]
name)

colorName :: Parsec Text u String
colorName :: forall u. Parsec Text u [Char]
colorName = forall s (m :: * -> *) t u a.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m [a]
many1 forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
letter forall s u (m :: * -> *) a.
ParsecT s u m a -> ParsecT s u m a -> ParsecT s u m a
<|> forall u. Parsec Text u [Char]
hexColor
  where
    hexColor :: ParsecT Text u Identity [Char]
hexColor = (:) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s (m :: * -> *) t a u.
Stream s m t =>
a -> ParsecT s u m a -> ParsecT s u m a
option Char
'#' (forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
char Char
'#') forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
6 forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
hexDigit