graphql-engine/server/src-lib/Hasura/Function/Common.hs
2023-05-19 04:48:46 +00:00

80 lines
2.2 KiB
Haskell

module Hasura.Function.Common
( getFunctionAggregateGQLName,
getFunctionArgsGQLName,
getFunctionGQLName,
getInputArgs,
)
where
import Control.Lens
import Data.Sequence qualified as Seq
import Hasura.Function.Cache
import Hasura.Function.Lenses
import Hasura.Name qualified as Name
import Hasura.Prelude
import Hasura.RQL.Types.Backend
import Language.GraphQL.Draft.Syntax qualified as G
-- | Apply function name customization to function arguments, as detailed in
-- 'rfcs/function-root-field-customisation.md'. We want the different
-- variations of a function (i.e. basic, aggregate) to share the same type name
-- for their arguments.
getFunctionArgsGQLName ::
-- | The GQL version of the DB name of the function
G.Name ->
FunctionConfig b ->
-- | Custom function for setting naming case
(G.Name -> G.Name) ->
G.Name
getFunctionArgsGQLName
funcGivenName
FunctionConfig {..}
setCase =
setCase $ fromMaybe funcGivenName _fcCustomName <> Name.__args
-- | Apply function name customization to the basic function variation, as
-- detailed in 'rfcs/function-root-field-customisation.md'.
getFunctionGQLName ::
G.Name ->
FunctionConfig b ->
-- | Custom function for setting naming case
(G.Name -> G.Name) ->
G.Name
getFunctionGQLName
funcGivenName
FunctionConfig
{ _fcCustomRootFields = FunctionCustomRootFields {..},
..
}
setCase =
choice
[ _fcrfFunction,
_fcCustomName
]
& fromMaybe (setCase funcGivenName)
-- | Apply function name customization to the aggregate function variation, as
-- detailed in 'rfcs/function-root-field-customisation.md'.
getFunctionAggregateGQLName ::
G.Name ->
FunctionConfig b ->
-- | Custom function for setting naming case
(G.Name -> G.Name) ->
G.Name
getFunctionAggregateGQLName
funcGivenName
FunctionConfig
{ _fcCustomRootFields = FunctionCustomRootFields {..},
..
}
setCase =
choice
[ _fcrfFunctionAggregate,
_fcCustomName <&> (<> Name.__aggregate)
]
& fromMaybe (setCase $ funcGivenName <> Name.__aggregate)
getInputArgs :: FunctionInfo b -> Seq.Seq (FunctionArgument b)
getInputArgs =
Seq.fromList . mapMaybe (^? _IAUserProvided) . toList . _fiInputArgs