packages feed

domaindriven-0.5.0: src/DomainDriven/Internal/NamedFields.hs

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE OverloadedLists #-}

module DomainDriven.Internal.NamedFields
    ( NF1 (..)
    , NF2 (..)
    , NF3 (..)
    , NF4 (..)
    , NF5 (..)
    , NF6 (..)
    , NF7 (..)
    , NF8 (..)
    , NF9 (..)
    )
where

import Data.Aeson
import qualified Data.Aeson.Key as Key
import qualified Data.Aeson.KeyMap as KM
import Data.OpenApi
import Data.Proxy
import qualified Data.Text as T
import GHC.Generics (Generic)
import GHC.TypeLits
import Prelude

data NF1 (name :: Symbol) (f1 :: Symbol) ty = NF1 ty
    deriving (Show, Generic)

data NF2 (name :: Symbol) (f1 :: Symbol) a1 (f2 :: Symbol) a2 = NF2 a1 a2
    deriving (Show, Generic)

data NF3 (name :: Symbol) (f1 :: Symbol) a1 (f2 :: Symbol) a2 (f3 :: Symbol) a3 = NF3 a1 a2 a3
    deriving (Show, Generic)

data NF4 (name :: Symbol) (f1 :: Symbol) a1 (f2 :: Symbol) a2 (f3 :: Symbol) a3 (f4 :: Symbol) a4 = NF4 a1 a2 a3 a4
    deriving (Show, Generic)

data NF5 (name :: Symbol) (f1 :: Symbol) a1 (f2 :: Symbol) a2 (f3 :: Symbol) a3 (f4 :: Symbol) a4 (f5 :: Symbol) a5 = NF5 a1 a2 a3 a4 a5
    deriving (Show, Generic)

data NF6 (name :: Symbol) (f1 :: Symbol) a1 (f2 :: Symbol) a2 (f3 :: Symbol) a3 (f4 :: Symbol) a4 (f5 :: Symbol) a5 (f6 :: Symbol) a6 = NF6 a1 a2 a3 a4 a5 a6
    deriving (Show, Generic)

data NF7 (name :: Symbol) (f1 :: Symbol) a1 (f2 :: Symbol) a2 (f3 :: Symbol) a3 (f4 :: Symbol) a4 (f5 :: Symbol) a5 (f6 :: Symbol) a6 (f7 :: Symbol) a7 = NF7 a1 a2 a3 a4 a5 a6 a7
    deriving (Show, Generic)

data NF8 (name :: Symbol) (f1 :: Symbol) a1 (f2 :: Symbol) a2 (f3 :: Symbol) a3 (f4 :: Symbol) a4 (f5 :: Symbol) a5 (f6 :: Symbol) a6 (f7 :: Symbol) a7 (f8 :: Symbol) a8 = NF8 a1 a2 a3 a4 a5 a6 a7 a8
    deriving (Show, Generic)

data NF9 (name :: Symbol) (f1 :: Symbol) a1 (f2 :: Symbol) a2 (f3 :: Symbol) a3 (f4 :: Symbol) a4 (f5 :: Symbol) a5 (f6 :: Symbol) a6 (f7 :: Symbol) a7 (f8 :: Symbol) a8 (f9 :: Symbol) a9 = NF9 a1 a2 a3 a4 a5 a6 a7 a8 a9
    deriving (Show, Generic)

symbolKey :: forall n. KnownSymbol n => Key
symbolKey = Key.fromString . symbolVal $ Proxy @n

instance (KnownSymbol f1, ToJSON a1) => ToJSON (NF1 name f1 a1) where
    toJSON (NF1 a1) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                ]

instance
    ( KnownSymbol f1
    , ToJSON a1
    , KnownSymbol f2
    , ToJSON a2
    )
    => ToJSON (NF2 name f1 a1 f2 a2)
    where
    toJSON (NF2 a1 a2) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                , (symbolKey @f2, toJSON a2)
                ]

instance
    ( KnownSymbol f1
    , ToJSON a1
    , KnownSymbol f2
    , ToJSON a2
    , KnownSymbol f3
    , ToJSON a3
    )
    => ToJSON (NF3 name f1 a1 f2 a2 f3 a3)
    where
    toJSON (NF3 a1 a2 a3) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                , (symbolKey @f2, toJSON a2)
                , (symbolKey @f3, toJSON a3)
                ]
instance
    ( KnownSymbol f1
    , ToJSON a1
    , KnownSymbol f2
    , ToJSON a2
    , KnownSymbol f3
    , ToJSON a3
    , KnownSymbol f4
    , ToJSON a4
    )
    => ToJSON (NF4 name f1 a1 f2 a2 f3 a3 f4 a4)
    where
    toJSON (NF4 a1 a2 a3 a4) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                , (symbolKey @f2, toJSON a2)
                , (symbolKey @f3, toJSON a3)
                , (symbolKey @f4, toJSON a4)
                ]
instance
    ( KnownSymbol f1
    , ToJSON a1
    , KnownSymbol f2
    , ToJSON a2
    , KnownSymbol f3
    , ToJSON a3
    , KnownSymbol f4
    , ToJSON a4
    , KnownSymbol f5
    , ToJSON a5
    )
    => ToJSON (NF5 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5)
    where
    toJSON (NF5 a1 a2 a3 a4 a5) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                , (symbolKey @f2, toJSON a2)
                , (symbolKey @f3, toJSON a3)
                , (symbolKey @f4, toJSON a4)
                , (symbolKey @f5, toJSON a5)
                ]
instance
    ( KnownSymbol f1
    , ToJSON a1
    , KnownSymbol f2
    , ToJSON a2
    , KnownSymbol f3
    , ToJSON a3
    , KnownSymbol f4
    , ToJSON a4
    , KnownSymbol f5
    , ToJSON a5
    , KnownSymbol f6
    , ToJSON a6
    )
    => ToJSON (NF6 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6)
    where
    toJSON (NF6 a1 a2 a3 a4 a5 a6) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                , (symbolKey @f2, toJSON a2)
                , (symbolKey @f3, toJSON a3)
                , (symbolKey @f4, toJSON a4)
                , (symbolKey @f5, toJSON a5)
                , (symbolKey @f6, toJSON a6)
                ]
instance
    ( KnownSymbol f1
    , ToJSON a1
    , KnownSymbol f2
    , ToJSON a2
    , KnownSymbol f3
    , ToJSON a3
    , KnownSymbol f4
    , ToJSON a4
    , KnownSymbol f5
    , ToJSON a5
    , KnownSymbol f6
    , ToJSON a6
    , KnownSymbol f7
    , ToJSON a7
    )
    => ToJSON (NF7 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7)
    where
    toJSON (NF7 a1 a2 a3 a4 a5 a6 a7) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                , (symbolKey @f2, toJSON a2)
                , (symbolKey @f3, toJSON a3)
                , (symbolKey @f4, toJSON a4)
                , (symbolKey @f5, toJSON a5)
                , (symbolKey @f6, toJSON a6)
                , (symbolKey @f7, toJSON a7)
                ]
instance
    ( KnownSymbol f1
    , ToJSON a1
    , KnownSymbol f2
    , ToJSON a2
    , KnownSymbol f3
    , ToJSON a3
    , KnownSymbol f4
    , ToJSON a4
    , KnownSymbol f5
    , ToJSON a5
    , KnownSymbol f6
    , ToJSON a6
    , KnownSymbol f7
    , ToJSON a7
    , KnownSymbol f8
    , ToJSON a8
    )
    => ToJSON (NF8 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7 f8 a8)
    where
    toJSON (NF8 a1 a2 a3 a4 a5 a6 a7 a8) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                , (symbolKey @f2, toJSON a2)
                , (symbolKey @f3, toJSON a3)
                , (symbolKey @f4, toJSON a4)
                , (symbolKey @f5, toJSON a5)
                , (symbolKey @f6, toJSON a6)
                , (symbolKey @f7, toJSON a7)
                , (symbolKey @f8, toJSON a8)
                ]
instance
    ( KnownSymbol f1
    , ToJSON a1
    , KnownSymbol f2
    , ToJSON a2
    , KnownSymbol f3
    , ToJSON a3
    , KnownSymbol f4
    , ToJSON a4
    , KnownSymbol f5
    , ToJSON a5
    , KnownSymbol f6
    , ToJSON a6
    , KnownSymbol f7
    , ToJSON a7
    , KnownSymbol f8
    , ToJSON a8
    , KnownSymbol f9
    , ToJSON a9
    )
    => ToJSON (NF9 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7 f8 a8 f9 a9)
    where
    toJSON (NF9 a1 a2 a3 a4 a5 a6 a7 a8 a9) =
        Object $
            KM.fromList
                [ (symbolKey @f1, toJSON a1)
                , (symbolKey @f2, toJSON a2)
                , (symbolKey @f3, toJSON a3)
                , (symbolKey @f4, toJSON a4)
                , (symbolKey @f5, toJSON a5)
                , (symbolKey @f6, toJSON a6)
                , (symbolKey @f7, toJSON a7)
                , (symbolKey @f8, toJSON a8)
                , (symbolKey @f9, toJSON a9)
                ]

instance
    (KnownSymbol name, KnownSymbol f1, FromJSON a1)
    => FromJSON (NF1 name f1 a1)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        pure $ NF1 a1

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , FromJSON a1
    , KnownSymbol f2
    , FromJSON a2
    )
    => FromJSON (NF2 name f1 a1 f2 a2)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        a2 <- o .: symbolKey @f2
        pure $ NF2 a1 a2

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , FromJSON a1
    , KnownSymbol f2
    , FromJSON a2
    , KnownSymbol f3
    , FromJSON a3
    )
    => FromJSON (NF3 name f1 a1 f2 a2 f3 a3)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        a2 <- o .: symbolKey @f2
        a3 <- o .: symbolKey @f3
        pure $ NF3 a1 a2 a3

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , FromJSON a1
    , KnownSymbol f2
    , FromJSON a2
    , KnownSymbol f3
    , FromJSON a3
    , KnownSymbol f4
    , FromJSON a4
    )
    => FromJSON (NF4 name f1 a1 f2 a2 f3 a3 f4 a4)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        a2 <- o .: symbolKey @f2
        a3 <- o .: symbolKey @f3
        a4 <- o .: symbolKey @f4
        pure $ NF4 a1 a2 a3 a4

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , FromJSON a1
    , KnownSymbol f2
    , FromJSON a2
    , KnownSymbol f3
    , FromJSON a3
    , KnownSymbol f4
    , FromJSON a4
    , KnownSymbol f5
    , FromJSON a5
    )
    => FromJSON (NF5 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        a2 <- o .: symbolKey @f2
        a3 <- o .: symbolKey @f3
        a4 <- o .: symbolKey @f4
        a5 <- o .: symbolKey @f5
        pure $ NF5 a1 a2 a3 a4 a5

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , FromJSON a1
    , KnownSymbol f2
    , FromJSON a2
    , KnownSymbol f3
    , FromJSON a3
    , KnownSymbol f4
    , FromJSON a4
    , KnownSymbol f5
    , FromJSON a5
    , KnownSymbol f6
    , FromJSON a6
    )
    => FromJSON (NF6 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        a2 <- o .: symbolKey @f2
        a3 <- o .: symbolKey @f3
        a4 <- o .: symbolKey @f4
        a5 <- o .: symbolKey @f5
        a6 <- o .: symbolKey @f6
        pure $ NF6 a1 a2 a3 a4 a5 a6

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , FromJSON a1
    , KnownSymbol f2
    , FromJSON a2
    , KnownSymbol f3
    , FromJSON a3
    , KnownSymbol f4
    , FromJSON a4
    , KnownSymbol f5
    , FromJSON a5
    , KnownSymbol f6
    , FromJSON a6
    , KnownSymbol f7
    , FromJSON a7
    )
    => FromJSON (NF7 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        a2 <- o .: symbolKey @f2
        a3 <- o .: symbolKey @f3
        a4 <- o .: symbolKey @f4
        a5 <- o .: symbolKey @f5
        a6 <- o .: symbolKey @f6
        a7 <- o .: symbolKey @f7
        pure $ NF7 a1 a2 a3 a4 a5 a6 a7

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , FromJSON a1
    , KnownSymbol f2
    , FromJSON a2
    , KnownSymbol f3
    , FromJSON a3
    , KnownSymbol f4
    , FromJSON a4
    , KnownSymbol f5
    , FromJSON a5
    , KnownSymbol f6
    , FromJSON a6
    , KnownSymbol f7
    , FromJSON a7
    , KnownSymbol f8
    , FromJSON a8
    )
    => FromJSON (NF8 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7 f8 a8)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        a2 <- o .: symbolKey @f2
        a3 <- o .: symbolKey @f3
        a4 <- o .: symbolKey @f4
        a5 <- o .: symbolKey @f5
        a6 <- o .: symbolKey @f6
        a7 <- o .: symbolKey @f7
        a8 <- o .: symbolKey @f8
        pure $ NF8 a1 a2 a3 a4 a5 a6 a7 a8

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , FromJSON a1
    , KnownSymbol f2
    , FromJSON a2
    , KnownSymbol f3
    , FromJSON a3
    , KnownSymbol f4
    , FromJSON a4
    , KnownSymbol f5
    , FromJSON a5
    , KnownSymbol f6
    , FromJSON a6
    , KnownSymbol f7
    , FromJSON a7
    , KnownSymbol f8
    , FromJSON a8
    , KnownSymbol f9
    , FromJSON a9
    )
    => FromJSON (NF9 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7 f8 a8 f9 a9)
    where
    parseJSON = withObject (symbolVal $ Proxy @name) $ \o -> do
        a1 <- o .: symbolKey @f1
        a2 <- o .: symbolKey @f2
        a3 <- o .: symbolKey @f3
        a4 <- o .: symbolKey @f4
        a5 <- o .: symbolKey @f5
        a6 <- o .: symbolKey @f6
        a7 <- o .: symbolKey @f7
        a8 <- o .: symbolKey @f8
        a9 <- o .: symbolKey @f9
        pure $ NF9 a1 a2 a3 a4 a5 a6 a7 a8 a9

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    )
    => ToSchema (NF1 name f1 a1)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        let f1 = T.pack . symbolVal $ Proxy @f1
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1]
                    , _schemaProperties = [(f1, Inline f1Dec)]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    , KnownSymbol f2
    , ToSchema a2
    )
    => ToSchema (NF2 name f1 a1 f2 a2)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        f2Dec <- declareSchema $ Proxy @a2
        let f1 = T.pack . symbolVal $ Proxy @f1
        let f2 = T.pack . symbolVal $ Proxy @f2
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1, f2]
                    , _schemaProperties =
                        [ (f1, Inline f1Dec)
                        , (f2, Inline f2Dec)
                        ]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    , KnownSymbol f2
    , ToSchema a2
    , KnownSymbol f3
    , ToSchema a3
    )
    => ToSchema (NF3 name f1 a1 f2 a2 f3 a3)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        f2Dec <- declareSchema $ Proxy @a2
        f3Dec <- declareSchema $ Proxy @a3
        let f1 = T.pack . symbolVal $ Proxy @f1
        let f2 = T.pack . symbolVal $ Proxy @f2
        let f3 = T.pack . symbolVal $ Proxy @f3
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1, f2, f3]
                    , _schemaProperties =
                        [ (f1, Inline f1Dec)
                        , (f2, Inline f2Dec)
                        , (f3, Inline f3Dec)
                        ]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    , KnownSymbol f2
    , ToSchema a2
    , KnownSymbol f3
    , ToSchema a3
    , KnownSymbol f4
    , ToSchema a4
    )
    => ToSchema (NF4 name f1 a1 f2 a2 f3 a3 f4 a4)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        f2Dec <- declareSchema $ Proxy @a2
        f3Dec <- declareSchema $ Proxy @a3
        f4Dec <- declareSchema $ Proxy @a4
        let f1 = T.pack . symbolVal $ Proxy @f1
        let f2 = T.pack . symbolVal $ Proxy @f2
        let f3 = T.pack . symbolVal $ Proxy @f3
        let f4 = T.pack . symbolVal $ Proxy @f4
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1, f2, f3, f4]
                    , _schemaProperties =
                        [ (f1, Inline f1Dec)
                        , (f2, Inline f2Dec)
                        , (f3, Inline f3Dec)
                        , (f4, Inline f4Dec)
                        ]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    , KnownSymbol f2
    , ToSchema a2
    , KnownSymbol f3
    , ToSchema a3
    , KnownSymbol f4
    , ToSchema a4
    , KnownSymbol f5
    , ToSchema a5
    )
    => ToSchema (NF5 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        f2Dec <- declareSchema $ Proxy @a2
        f3Dec <- declareSchema $ Proxy @a3
        f4Dec <- declareSchema $ Proxy @a4
        f5Dec <- declareSchema $ Proxy @a5
        let f1 = T.pack . symbolVal $ Proxy @f1
        let f2 = T.pack . symbolVal $ Proxy @f2
        let f3 = T.pack . symbolVal $ Proxy @f3
        let f4 = T.pack . symbolVal $ Proxy @f4
        let f5 = T.pack . symbolVal $ Proxy @f5
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1, f2, f3, f4, f5]
                    , _schemaProperties =
                        [ (f1, Inline f1Dec)
                        , (f2, Inline f2Dec)
                        , (f3, Inline f3Dec)
                        , (f4, Inline f4Dec)
                        , (f5, Inline f5Dec)
                        ]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    , KnownSymbol f2
    , ToSchema a2
    , KnownSymbol f3
    , ToSchema a3
    , KnownSymbol f4
    , ToSchema a4
    , KnownSymbol f5
    , ToSchema a5
    , KnownSymbol f6
    , ToSchema a6
    )
    => ToSchema (NF6 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        f2Dec <- declareSchema $ Proxy @a2
        f3Dec <- declareSchema $ Proxy @a3
        f4Dec <- declareSchema $ Proxy @a4
        f5Dec <- declareSchema $ Proxy @a5
        f6Dec <- declareSchema $ Proxy @a6
        let f1 = T.pack . symbolVal $ Proxy @f1
        let f2 = T.pack . symbolVal $ Proxy @f2
        let f3 = T.pack . symbolVal $ Proxy @f3
        let f4 = T.pack . symbolVal $ Proxy @f4
        let f5 = T.pack . symbolVal $ Proxy @f5
        let f6 = T.pack . symbolVal $ Proxy @f6
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1, f2, f3, f4, f5, f6]
                    , _schemaProperties =
                        [ (f1, Inline f1Dec)
                        , (f2, Inline f2Dec)
                        , (f3, Inline f3Dec)
                        , (f4, Inline f4Dec)
                        , (f5, Inline f5Dec)
                        , (f6, Inline f6Dec)
                        ]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    , KnownSymbol f2
    , ToSchema a2
    , KnownSymbol f3
    , ToSchema a3
    , KnownSymbol f4
    , ToSchema a4
    , KnownSymbol f5
    , ToSchema a5
    , KnownSymbol f6
    , ToSchema a6
    , KnownSymbol f7
    , ToSchema a7
    )
    => ToSchema (NF7 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        f2Dec <- declareSchema $ Proxy @a2
        f3Dec <- declareSchema $ Proxy @a3
        f4Dec <- declareSchema $ Proxy @a4
        f5Dec <- declareSchema $ Proxy @a5
        f6Dec <- declareSchema $ Proxy @a6
        f7Dec <- declareSchema $ Proxy @a7
        let f1 = T.pack . symbolVal $ Proxy @f1
        let f2 = T.pack . symbolVal $ Proxy @f2
        let f3 = T.pack . symbolVal $ Proxy @f3
        let f4 = T.pack . symbolVal $ Proxy @f4
        let f5 = T.pack . symbolVal $ Proxy @f5
        let f6 = T.pack . symbolVal $ Proxy @f6
        let f7 = T.pack . symbolVal $ Proxy @f7
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1, f2, f3, f4, f5, f6, f7]
                    , _schemaProperties =
                        [ (f1, Inline f1Dec)
                        , (f2, Inline f2Dec)
                        , (f3, Inline f3Dec)
                        , (f4, Inline f4Dec)
                        , (f5, Inline f5Dec)
                        , (f6, Inline f6Dec)
                        , (f7, Inline f7Dec)
                        ]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    , KnownSymbol f2
    , ToSchema a2
    , KnownSymbol f3
    , ToSchema a3
    , KnownSymbol f4
    , ToSchema a4
    , KnownSymbol f5
    , ToSchema a5
    , KnownSymbol f6
    , ToSchema a6
    , KnownSymbol f7
    , ToSchema a7
    , KnownSymbol f8
    , ToSchema a8
    )
    => ToSchema (NF8 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7 f8 a8)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        f2Dec <- declareSchema $ Proxy @a2
        f3Dec <- declareSchema $ Proxy @a3
        f4Dec <- declareSchema $ Proxy @a4
        f5Dec <- declareSchema $ Proxy @a5
        f6Dec <- declareSchema $ Proxy @a6
        f7Dec <- declareSchema $ Proxy @a7
        f8Dec <- declareSchema $ Proxy @a8
        let f1 = T.pack . symbolVal $ Proxy @f1
        let f2 = T.pack . symbolVal $ Proxy @f2
        let f3 = T.pack . symbolVal $ Proxy @f3
        let f4 = T.pack . symbolVal $ Proxy @f4
        let f5 = T.pack . symbolVal $ Proxy @f5
        let f6 = T.pack . symbolVal $ Proxy @f6
        let f7 = T.pack . symbolVal $ Proxy @f7
        let f8 = T.pack . symbolVal $ Proxy @f8
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1, f2, f3, f4, f5, f6, f7, f8]
                    , _schemaProperties =
                        [ (f1, Inline f1Dec)
                        , (f2, Inline f2Dec)
                        , (f3, Inline f3Dec)
                        , (f4, Inline f4Dec)
                        , (f5, Inline f5Dec)
                        , (f6, Inline f6Dec)
                        , (f7, Inline f7Dec)
                        , (f8, Inline f8Dec)
                        ]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }

instance
    ( KnownSymbol name
    , KnownSymbol f1
    , ToSchema a1
    , KnownSymbol f2
    , ToSchema a2
    , KnownSymbol f3
    , ToSchema a3
    , KnownSymbol f4
    , ToSchema a4
    , KnownSymbol f5
    , ToSchema a5
    , KnownSymbol f6
    , ToSchema a6
    , KnownSymbol f7
    , ToSchema a7
    , KnownSymbol f8
    , ToSchema a8
    , KnownSymbol f9
    , ToSchema a9
    )
    => ToSchema (NF9 name f1 a1 f2 a2 f3 a3 f4 a4 f5 a5 f6 a6 f7 a7 f8 a8 f9 a9)
    where
    declareNamedSchema _ = do
        f1Dec <- declareSchema $ Proxy @a1
        f2Dec <- declareSchema $ Proxy @a2
        f3Dec <- declareSchema $ Proxy @a3
        f4Dec <- declareSchema $ Proxy @a4
        f5Dec <- declareSchema $ Proxy @a5
        f6Dec <- declareSchema $ Proxy @a6
        f7Dec <- declareSchema $ Proxy @a7
        f8Dec <- declareSchema $ Proxy @a8
        f9Dec <- declareSchema $ Proxy @a9
        let f1 = T.pack . symbolVal $ Proxy @f1
        let f2 = T.pack . symbolVal $ Proxy @f2
        let f3 = T.pack . symbolVal $ Proxy @f3
        let f4 = T.pack . symbolVal $ Proxy @f4
        let f5 = T.pack . symbolVal $ Proxy @f5
        let f6 = T.pack . symbolVal $ Proxy @f6
        let f7 = T.pack . symbolVal $ Proxy @f7
        let f8 = T.pack . symbolVal $ Proxy @f8
        let f9 = T.pack . symbolVal $ Proxy @f9
        -- Not sure we should be inlining the schema. Let
        let nfSchema :: Schema
            nfSchema =
                mempty
                    { _schemaRequired = [f1, f2, f3, f4, f5, f6, f7, f8, f9]
                    , _schemaProperties =
                        [ (f1, Inline f1Dec)
                        , (f2, Inline f2Dec)
                        , (f3, Inline f3Dec)
                        , (f4, Inline f4Dec)
                        , (f5, Inline f5Dec)
                        , (f6, Inline f6Dec)
                        , (f7, Inline f7Dec)
                        , (f8, Inline f8Dec)
                        , (f9, Inline f9Dec)
                        ]
                    }
        pure
            NamedSchema
                { _namedSchemaName = Just . T.pack . symbolVal $ Proxy @name
                , _namedSchemaSchema = nfSchema
                }