packages feed

lnurl-0.1.0.0: src/LnUrl/Utils.hs

{-# LANGUAGE OverloadedStrings #-}

module LnUrl.Utils (
    Base16 (..),
    Base64 (..),
    JsonURI (..),
    (.=?),
) where

import Data.Aeson (
    FromJSON,
    ToJSON,
    Value,
    parseJSON,
    toJSON,
    withText,
    (.=),
 )
import Data.ByteString (ByteString)
import Data.ByteString.Base16 (decodeBase16, encodeBase16)
import Data.ByteString.Base64 (decodeBase64, encodeBase64)
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Text.Encoding (encodeUtf8)
import Network.URI (URI, parseURI)

newtype Base16 = Base16 {getBase16 :: ByteString}
    deriving (Eq, Show)

instance FromJSON Base16 where
    parseJSON =
        withText "Base16" $
            either (fail . Text.unpack) (pure . Base16)
                . decodeBase16
                . encodeUtf8

instance ToJSON Base16 where
    toJSON = toJSON . encodeBase16 . getBase16

newtype Base64 = Base64 {getBase64 :: ByteString}
    deriving (Eq, Show)

instance FromJSON Base64 where
    parseJSON =
        withText "Base64" $
            either (fail . Text.unpack) (pure . Base64)
                . decodeBase64
                . encodeUtf8

instance ToJSON Base64 where
    toJSON = toJSON . encodeBase64 . getBase64

newtype JsonURI = JsonURI {getJsonURI :: URI}
    deriving (Eq, Show)

instance FromJSON JsonURI where
    parseJSON = withText "JsonURI" $ maybe noParse (pure . JsonURI) . parseURI . Text.unpack
      where
        noParse = fail "Unable to parse URI"

instance ToJSON JsonURI where
    toJSON = toJSON . show . getJsonURI

(.=?) :: ToJSON a => Text -> Maybe a -> Maybe (Text, Value)
k .=? mv = (k .=) <$> mv