From 900cbe415e3ee26ab3269bb3d9eccf4d0f3edefb Mon Sep 17 00:00:00 2001 From: Philipp Balzarek Date: Mon, 17 Jun 2013 13:52:45 +0200 Subject: [PATCH] add jid quasi quoter (jidQ) --- pontarius-xmpp.cabal | 2 ++ source/Network/Xmpp.hs | 1 + source/Network/Xmpp/Types.hs | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/pontarius-xmpp.cabal b/pontarius-xmpp.cabal index f47d74b..84f7d23 100644 --- a/pontarius-xmpp.cabal +++ b/pontarius-xmpp.cabal @@ -56,6 +56,7 @@ Library , split >=0.1.2.3 , stm >=2.1.2.1 , stringprep >=0.1.3 + , template-haskell >=2.5 , text >=0.11.1.5 , tls >=1.1.0 , tls-extra >=0.5.0 @@ -91,6 +92,7 @@ Library , split >=0.1.2.3 , stm >=2.1.2.1 , stringprep >=0.1.3 + , template-haskell >=2.5 , text >=0.11.1.5 , tls >=1.1.0 , tls-extra >=0.5.0 diff --git a/source/Network/Xmpp.hs b/source/Network/Xmpp.hs index b5aab7e..56952e6 100644 --- a/source/Network/Xmpp.hs +++ b/source/Network/Xmpp.hs @@ -45,6 +45,7 @@ module Network.Xmpp -- for addressing entities in the network. It is somewhat similar to an e-mail -- address, but contains three parts instead of two. , Jid + , jidQ , isBare , isFull , jidFromText diff --git a/source/Network/Xmpp/Types.hs b/source/Network/Xmpp/Types.hs index 8a651b1..4a34341 100644 --- a/source/Network/Xmpp/Types.hs +++ b/source/Network/Xmpp/Types.hs @@ -1,5 +1,6 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE TupleSections #-} +{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE StandaloneDeriving #-} @@ -43,6 +44,7 @@ module Network.Xmpp.Types , StreamConfiguration(..) , langTag , Jid(..) + , jidQ , isBare , isFull , jidFromText @@ -76,6 +78,8 @@ import Data.Text (Text) import qualified Data.Text as Text import Data.Typeable(Typeable) import Data.XML.Types +import Language.Haskell.TH.Quote +import Language.Haskell.TH import Network import Network.DNS import Network.TLS hiding (Version) @@ -960,6 +964,22 @@ instance Read Jid where [(parseJid (read s' :: String), r)] -- May fail with "Prelude.read: no parse" -- or the `parseJid' error message (see below) +jidQ :: QuasiQuoter +jidQ = QuasiQuoter { quoteExp = \s -> case jidFromText (Text.pack s) of + Nothing -> fail $ "Could not parse JID " ++ s + Just j -> [| Jid $(mbTextE $ localpart_ j) + $(textE $ domainpart_ j) + $(mbTextE $ resourcepart_ j) + |] + , quotePat = fail "Jid patterns aren't implemented" + , quoteType = fail "jid QQ can't be used in type context" + , quoteDec = fail "jid QQ can't be used in declaration context" + } + where + textE t = [| Text.pack $(stringE $ Text.unpack t) |] + mbTextE Nothing = [| Nothing |] + mbTextE (Just s) = [| Just $(textE s) |] + -- | Parses a JID string. -- -- Note: This function is only meant to be used to reverse @Jid@ Show