-- | Helpers to apply the Kleisli operator (`>=>`) on XML (xml-conduit)
-- structures.
module Testlib.KleisliXML where

import qualified Data.Text as T
import qualified Data.Text.Lazy as LT
import Testlib.Prelude
import qualified Text.XML as XML
import qualified Text.XML.Cursor as XML

findElement :: XML.Name -> XML.Cursor -> Maybe XML.Cursor
findElement :: Name -> Cursor -> Maybe Cursor
findElement Name
name = [Cursor] -> Maybe Cursor
forall a. [a] -> Maybe a
listToMaybe ([Cursor] -> Maybe Cursor)
-> (Cursor -> [Cursor]) -> Cursor -> Maybe Cursor
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Cursor -> (Cursor -> [Cursor]) -> [Cursor]
forall node a. Cursor node -> (Cursor node -> [a]) -> [a]
XML.$// Name -> Cursor -> [Cursor]
XML.element Name
name)

getAttribute :: XML.Name -> XML.Cursor -> Maybe T.Text
getAttribute :: Name -> Cursor -> Maybe Text
getAttribute Name
name = [Text] -> Maybe Text
forall a. [a] -> Maybe a
listToMaybe ([Text] -> Maybe Text)
-> (Cursor -> [Text]) -> Cursor -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Cursor -> (Cursor -> [Text]) -> [Text]
forall node a. Cursor node -> (Cursor node -> a) -> a
XML.$| Name -> Cursor -> [Text]
XML.attribute Name
name)

getContent :: XML.Cursor -> Maybe T.Text
getContent :: Cursor -> Maybe Text
getContent = [Text] -> Maybe Text
forall a. [a] -> Maybe a
listToMaybe ([Text] -> Maybe Text)
-> (Cursor -> [Text]) -> Cursor -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Cursor -> (Cursor -> [Text]) -> [Text]
forall node a. Cursor node -> (Cursor node -> [a]) -> [a]
XML.$// Cursor -> [Text]
XML.content)

parseXml :: LT.Text -> XML.Cursor
parseXml :: Text -> Cursor
parseXml = Document -> Cursor
XML.fromDocument (Document -> Cursor) -> (Text -> Document) -> Text -> Cursor
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParseSettings -> Text -> Document
XML.parseText_ ParseSettings
forall a. Default a => a
XML.def