-- | Utilities for parsing JSON responses from the API
module Reddit.Parser
  ( ensureKind
  , stripPrefix ) where

import Control.Monad (guard)
import Data.Aeson.Types (Parser, Object, (.:))
import Data.Monoid
import Data.Text (Text)
import Prelude
import qualified Data.Text as Text

-- | Fail to parse unless the @Object@'s kind is what it should be.
ensureKind :: Object -> Text -> Parser ()
ensureKind :: Object -> Text -> Parser ()
ensureKind Object
o Text
k = do
  Text
kind <- Object
o Object -> Key -> Parser Text
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"kind"
  Bool -> Parser ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Parser ()) -> Bool -> Parser ()
forall a b. (a -> b) -> a -> b
$ Text
kind Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
k

-- | Parse an ID in either the "tX_XXXXXX" or simply "XXXXXX" format.
stripPrefix :: Text -> Text -> Parser Text
stripPrefix :: Text -> Text -> Parser Text
stripPrefix Text
prefix Text
string =
  case Text -> Text -> (Text, Text)
Text.breakOn Text
"_" Text
string of
    (Text
t, Text
i) | Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
prefix ->
      case Text -> Text -> Maybe Text
Text.stripPrefix Text
"_" Text
i of
        Just Text
rest -> Text -> Parser Text
forall (m :: * -> *) a. Monad m => a -> m a
return Text
rest
        Maybe Text
Nothing -> Parser Text
forall a. Monoid a => a
mempty
    (Text
i, Text
"") -> Text -> Parser Text
forall (m :: * -> *) a. Monad m => a -> m a
return Text
i
    (Text, Text)
_ -> Parser Text
forall a. Monoid a => a
mempty