@@ -47,6 +47,7 @@ import Control.Monad.Except (ExceptT, runExceptT)
4747import Control.Monad.IO.Class
4848import Control.Monad.Trans.Reader (ReaderT (..))
4949import Data.Aeson (Value)
50+ import qualified Data.Aeson as Aeson
5051{ {#authMethods} }
5152{ {#isApiKey} }
5253import Data.ByteString (ByteString)
@@ -55,6 +56,7 @@ import Data.ByteString (ByteString)
5556import Data.ByteString (ByteString)
5657{ {/isBasicBearer} }
5758{ {/authMethods} }
59+ import qualified Data.ByteString.Lazy as BSL
5860import Data.Coerce (coerce)
5961import Data.Data (Data)
6062import Data.Function ((& ))
@@ -64,6 +66,7 @@ import Data.Proxy (Proxy (..))
6466import Data.Set (Set)
6567import Data.Text (Text)
6668import qualified Data.Text as T
69+ import qualified Data.Text.Encoding as T
6770import Data.Time
6871import Data.UUID (UUID)
6972import GHC.Exts (IsString (..))
@@ -166,6 +169,16 @@ instance ToHttpApiData a => ToHttpApiData (QueryList 'MultiParamArray a) where
166169formatSeparatedQueryList :: ToHttpApiData a => Char -> QueryList p a -> Text
167170formatSeparatedQueryList char = T.intercalate (T.singleton char) . map toQueryParam . fromQueryList
168171
172+ newtype JSONQueryParam a = JSONQueryParam
173+ { fromJsonQueryParam :: a
174+ } deriving (Functor, Foldable, Traversable)
175+
176+ instance Aeson.ToJSON a => ToHttpApiData (JSONQueryParam a) where
177+ toQueryParam = T.decodeUtf8 . BSL.toStrict . Aeson.encode . fromJsonQueryParam
178+
179+ instance Aeson.FromJSON a => FromHttpApiData (JSONQueryParam a) where
180+ parseQueryParam = either (Left . T.pack) (Right . JSONQueryParam) . Aeson.eitherDecodeStrict . T.encodeUtf8
181+
169182
170183{ {#apiInfo} }
171184-- | Servant type-level API, generated from the OpenAPI spec for { {title} }.
0 commit comments