module Iri.QuasiQuoter
( uri,
httpUri,
iri,
httpIri,
)
where
import Data.Attoparsec.ByteString qualified as B
import Data.Attoparsec.Text qualified as C
import Iri.Parsing.Attoparsec.ByteString qualified as A
import Iri.Parsing.Attoparsec.Text qualified as D
import Iri.Prelude hiding (exp)
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax
exp :: (String -> Q Exp) -> QuasiQuoter
exp :: (String -> Q Exp) -> QuasiQuoter
exp String -> Q Exp
exp =
(String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter String -> Q Exp
exp String -> Q Pat
forall {m :: * -> *} {p} {a}. MonadFail m => p -> m a
unsupported String -> Q Type
forall {m :: * -> *} {p} {a}. MonadFail m => p -> m a
unsupported String -> Q [Dec]
forall {m :: * -> *} {p} {a}. MonadFail m => p -> m a
unsupported
where
unsupported :: p -> m a
unsupported p
_ =
String -> m a
forall a. String -> m a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Not supported"
uri :: QuasiQuoter
uri :: QuasiQuoter
uri =
(String -> Q Exp) -> QuasiQuoter
exp ((String -> Q Exp) -> QuasiQuoter)
-> (String -> Q Exp) -> QuasiQuoter
forall a b. (a -> b) -> a -> b
$ \String
string ->
case Parser Iri -> ByteString -> Either String Iri
forall a. Parser a -> ByteString -> Either String a
B.parseOnly (Parser Iri
A.uri Parser Iri -> Parser ByteString () -> Parser Iri
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ByteString ()
forall t. Chunk t => Parser t ()
B.endOfInput) (String -> ByteString
forall a. IsString a => String -> a
fromString String
string) of
Right Iri
uri -> Iri -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => Iri -> m Exp
lift Iri
uri
Left String
error -> String -> Q Exp
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> ShowS
showString String
"URI parsing: " String
error)
httpUri :: QuasiQuoter
httpUri :: QuasiQuoter
httpUri =
(String -> Q Exp) -> QuasiQuoter
exp ((String -> Q Exp) -> QuasiQuoter)
-> (String -> Q Exp) -> QuasiQuoter
forall a b. (a -> b) -> a -> b
$ \String
string ->
case Parser HttpIri -> ByteString -> Either String HttpIri
forall a. Parser a -> ByteString -> Either String a
B.parseOnly (Parser HttpIri
A.httpUri Parser HttpIri -> Parser ByteString () -> Parser HttpIri
forall a b.
Parser ByteString a -> Parser ByteString b -> Parser ByteString a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ByteString ()
forall t. Chunk t => Parser t ()
B.endOfInput) (String -> ByteString
forall a. IsString a => String -> a
fromString String
string) of
Right HttpIri
uri -> HttpIri -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => HttpIri -> m Exp
lift HttpIri
uri
Left String
error -> String -> Q Exp
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> ShowS
showString String
"HTTP URI parsing: " String
error)
iri :: QuasiQuoter
iri :: QuasiQuoter
iri =
(String -> Q Exp) -> QuasiQuoter
exp ((String -> Q Exp) -> QuasiQuoter)
-> (String -> Q Exp) -> QuasiQuoter
forall a b. (a -> b) -> a -> b
$ \String
string ->
case Parser Iri -> Text -> Either String Iri
forall a. Parser a -> Text -> Either String a
C.parseOnly (Parser Iri
D.iri Parser Iri -> Parser Text () -> Parser Iri
forall a b. Parser Text a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
C.endOfInput) (String -> Text
forall a. IsString a => String -> a
fromString String
string) of
Right Iri
iri -> Iri -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => Iri -> m Exp
lift Iri
iri
Left String
error -> String -> Q Exp
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> ShowS
showString String
"IRI parsing: " String
error)
httpIri :: QuasiQuoter
httpIri :: QuasiQuoter
httpIri =
(String -> Q Exp) -> QuasiQuoter
exp ((String -> Q Exp) -> QuasiQuoter)
-> (String -> Q Exp) -> QuasiQuoter
forall a b. (a -> b) -> a -> b
$ \String
string ->
case Parser HttpIri -> Text -> Either String HttpIri
forall a. Parser a -> Text -> Either String a
C.parseOnly (Parser HttpIri
D.httpIri Parser HttpIri -> Parser Text () -> Parser HttpIri
forall a b. Parser Text a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser Text ()
forall t. Chunk t => Parser t ()
C.endOfInput) (String -> Text
forall a. IsString a => String -> a
fromString String
string) of
Right HttpIri
iri -> HttpIri -> Q Exp
forall t (m :: * -> *). (Lift t, Quote m) => t -> m Exp
forall (m :: * -> *). Quote m => HttpIri -> m Exp
lift HttpIri
iri
Left String
error -> String -> Q Exp
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> ShowS
showString String
"HTTP IRI parsing: " String
error)