module Components.ObjectHandlers.ServerObjectInspector (checkObjectsAttributes,replaceObjectsVariables,flagOneWay) where


import Control.Exception (throw)
import Data.Foldable (foldl')
import Model.ServerObjectTypes (
        ServerObject,
        RootObject,
        ScalarType(..),
        Field,
        InlinefragmentObject(..),
        NestedObject(..),
        FlagNode(..)
    )
import Model.ServerExceptions (
        ReferenceException(
            UnrecognisedObjectException,
            UnrecognisedScalarException
        ),
        QueryException(MismatchedVariableTypeException)
    )
import Components.ObjectHandlers.ObjectsHandler (
        isValidServerObjectChild,
        isValidServerObjectScalarField,
        isValidScalarTransformation,
        isInterface,
        translateInterfaceToServerObjects
    )

-- check that all nested objects are with valid properties
checkObjectsAttributes :: [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> [RootObject] -> Bool
checkObjectsAttributes :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])] -> [RootObject] -> Bool
checkObjectsAttributes sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa objs :: [RootObject]
objs = (RootObject -> Bool) -> [RootObject] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\x :: RootObject
x->RootObject
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
hasValidAttributes RootObject
x [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa) [RootObject]
objs
hasValidAttributes :: NestedObject -> [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> Bool
hasValidAttributes :: RootObject
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
hasValidAttributes (NestedObject alias :: Alias
alias name :: String
name sobject :: String
sobject Nothing sfs :: SubFields
sfs) sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa = String
-> SubFields
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidSubFields String
sobject SubFields
sfs [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa
hasValidAttributes (NestedObject alias :: Alias
alias name :: String
name sobject :: String
sobject (Just ss :: ScalarType
ss) sfs :: SubFields
sfs) sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa = (String
-> ScalarType
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidSubSelection String
sobject ScalarType
ss [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa)Bool -> Bool -> Bool
&&String
-> SubFields
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidSubFields String
sobject SubFields
sfs [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa
isValidSubSelection :: ServerObject -> ScalarType -> [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> Bool
isValidSubSelection :: String
-> ScalarType
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidSubSelection obj :: String
obj (ScalarType alias :: Alias
alias name :: String
name trans :: Alias
trans arg :: Alias
arg) sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa = (String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidServerObjectScalarField String
obj String
name [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa)Bool -> Bool -> Bool
&&String
-> String
-> Alias
-> Alias
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidScalarTransformation String
obj String
name Alias
trans Alias
arg [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa
isValidSubFields :: ServerObject -> [Field] -> [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> Bool
isValidSubFields :: String
-> SubFields
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidSubFields _ [] _ _ = Bool
True  -- we should not get an empty query
isValidSubFields obj :: String
obj sfs :: SubFields
sfs sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa = (Field -> Bool) -> SubFields -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\x :: Field
x->String
-> Field
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidSubField String
obj Field
x [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa) SubFields
sfs
isValidSubField :: ServerObject -> Field -> [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> Bool
isValidSubField :: String
-> Field
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidSubField obj :: String
obj (Left (ScalarType alias :: Alias
alias "__typename" trans :: Alias
trans arg :: Alias
arg)) sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa = Bool
True
isValidSubField obj :: String
obj (Left (ScalarType alias :: Alias
alias name :: String
name trans :: Alias
trans arg :: Alias
arg)) sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa = (String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidServerObjectScalarField String
obj String
name [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa)Bool -> Bool -> Bool
&&String
-> String
-> Alias
-> Alias
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidScalarTransformation String
obj String
name Alias
trans Alias
arg [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa
isValidSubField obj :: String
obj (Right (Left (NestedObject alias :: Alias
alias name :: String
name sobject :: String
sobject ss :: Maybe ScalarType
ss sfs :: SubFields
sfs))) sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa = RootObject
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
hasValidAttributes (Alias
-> String -> String -> Maybe ScalarType -> SubFields -> RootObject
NestedObject Alias
alias String
name String
sobject Maybe ScalarType
ss SubFields
sfs) [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa
isValidSubField obj :: String
obj (Right (Right (InlinefragmentObject ifo :: String
ifo sfs :: SubFields
sfs))) sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa = (String -> String -> [(String, [String], [String])] -> Bool
isValidServerObjectChild String
obj String
ifo [(String, [String], [String])]
soa)Bool -> Bool -> Bool
&&String
-> SubFields
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> Bool
isValidSubFields String
ifo SubFields
sfs [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa
-- replace variables with values and do type checking
replaceObjectsVariables :: [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> [RootObject] -> [(String,String,String)] -> [RootObject]
replaceObjectsVariables :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> [RootObject]
-> [(String, String, String)]
-> [RootObject]
replaceObjectsVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa objs :: [RootObject]
objs vars :: [(String, String, String)]
vars = [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> RootObject
-> [(String, String, String)]
-> RootObject
replaceObjectVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa RootObject
obj [(String, String, String)]
vars | RootObject
obj<-[RootObject]
objs]
replaceObjectVariables :: [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> RootObject -> [(String,String,String)] -> RootObject
replaceObjectVariables :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> RootObject
-> [(String, String, String)]
-> RootObject
replaceObjectVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa (NestedObject alias :: Alias
alias name :: String
name sobject :: String
sobject Nothing sfs :: SubFields
sfs) vars :: [(String, String, String)]
vars = Alias
-> String -> String -> Maybe ScalarType -> SubFields -> RootObject
NestedObject Alias
alias String
name String
sobject Maybe ScalarType
forall a. Maybe a
Nothing [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa String
sobject [(String, String, String)]
vars Field
sf | Field
sf<-SubFields
sfs]
replaceObjectVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa (NestedObject alias :: Alias
alias name :: String
name sobject :: String
sobject (Just (ScalarType sAlias :: Alias
sAlias sName :: String
sName trans :: Alias
trans Nothing)) sfs :: SubFields
sfs) vars :: [(String, String, String)]
vars = Alias
-> String -> String -> Maybe ScalarType -> SubFields -> RootObject
NestedObject Alias
alias String
name String
sobject (ScalarType -> Maybe ScalarType
forall a. a -> Maybe a
Just (ScalarType -> Maybe ScalarType) -> ScalarType -> Maybe ScalarType
forall a b. (a -> b) -> a -> b
$ Alias -> String -> Alias -> Alias -> ScalarType
ScalarType Alias
sAlias String
sName Alias
trans Alias
forall a. Maybe a
Nothing) [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa String
sobject [(String, String, String)]
vars Field
sf | Field
sf<-SubFields
sfs]
replaceObjectVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa (NestedObject alias :: Alias
alias name :: String
name sobject :: String
sobject (Just (ScalarType sAlias :: Alias
sAlias sName :: String
sName trans :: Alias
trans (Just arg :: String
arg))) sfs :: SubFields
sfs) vars :: [(String, String, String)]
vars = Alias
-> String -> String -> Maybe ScalarType -> SubFields -> RootObject
NestedObject Alias
alias String
name String
sobject Maybe ScalarType
newScalar [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa String
sobject [(String, String, String)]
vars Field
sf | Field
sf<-SubFields
sfs]
  where
    newScalar :: Maybe ScalarType
newScalar = ScalarType -> Maybe ScalarType
forall a. a -> Maybe a
Just (ScalarType -> Maybe ScalarType) -> ScalarType -> Maybe ScalarType
forall a b. (a -> b) -> a -> b
$ Alias -> String -> Alias -> Alias -> ScalarType
ScalarType Alias
sAlias String
sName Alias
trans (Alias -> ScalarType) -> Alias -> ScalarType
forall a b. (a -> b) -> a -> b
$ String -> Alias
forall a. a -> Maybe a
Just String
newValue
    newValue :: String
newValue = if String -> Bool
isVariable String
arg then String -> String -> [(String, String, String)] -> String
replaceScalarVariable (String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
getScalarTypeForVariableReplacement String
sobject String
sName [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa) String
arg [(String, String, String)]
vars else String
arg

getScalarTypeForVariableReplacement :: ServerObject -> String -> [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> String
getScalarTypeForVariableReplacement :: String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
getScalarTypeForVariableReplacement obj :: String
obj st :: String
st ((h :: String
h,sts :: [(String, String, [(String, [(String, String, String, String)])])]
sts):rst :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
rst) [] = if String
hString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
obj then String
-> [(String, String,
     [(String, [(String, String, String, String)])])]
-> String
findScalarType String
st [(String, String, [(String, [(String, String, String, String)])])]
sts else String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
getScalarTypeForVariableReplacement String
obj String
st [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
rst []
getScalarTypeForVariableReplacement obj :: String
obj st :: String
st sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss ((pnt :: String
pnt,_,(fst :: String
fst:_)):rst :: [(String, [String], [String])]
rst) = if String
pntString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
obj then String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
getScalarTypeForVariableReplacement String
fst String
st [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [] else String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
getScalarTypeForVariableReplacement String
obj String
st [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
rst
getScalarTypeForVariableReplacement obj :: String
obj st :: String
st sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss ((pnt :: String
pnt,_,[]):rst :: [(String, [String], [String])]
rst) = if String
pntString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
obj then ReferenceException -> String
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException else String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
getScalarTypeForVariableReplacement String
obj String
st [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
rst
getScalarTypeForVariableReplacement _ _ [] _ = ReferenceException -> String
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedObjectException
findScalarType :: String -> [(String,String,[(String,[(String,String,String,String)])])] -> String
findScalarType :: String
-> [(String, String,
     [(String, [(String, String, String, String)])])]
-> String
findScalarType st :: String
st ((name :: String
name,typ :: String
typ,_):rst :: [(String, String, [(String, [(String, String, String, String)])])]
rst) = if String
stString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
name then String
typ else String
-> [(String, String,
     [(String, [(String, String, String, String)])])]
-> String
findScalarType String
st [(String, String, [(String, [(String, String, String, String)])])]
rst
findScalarType _ [] = ReferenceException -> String
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedScalarException

replaceScalarVariable :: String -> String -> [(String,String,String)] -> String
replaceScalarVariable :: String -> String -> [(String, String, String)] -> String
replaceScalarVariable typ :: String
typ arg :: String
arg ((vn :: String
vn,vt :: String
vt,vval :: String
vval):rst :: [(String, String, String)]
rst)
 | String
argString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
vnBool -> Bool -> Bool
&&String
typString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
vt = String
vval
 | String
argString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
vn = QueryException -> String
forall a e. Exception e => e -> a
throw QueryException
MismatchedVariableTypeException
 | Bool
otherwise = String -> String -> [(String, String, String)] -> String
replaceScalarVariable String
typ String
arg [(String, String, String)]
rst
replaceScalarVariable _ _ [] = ReferenceException -> String
forall a e. Exception e => e -> a
throw ReferenceException
UnrecognisedScalarException

replaceSubfieldVariables :: [(String,[(String,String,[(String,[(String,String,String,String)])])])] -> [(String,[String],[String])] -> String -> [(String,String,String)] -> Field -> Field
replaceSubfieldVariables :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables _ _ _ _ (Left (ScalarType alias :: Alias
alias name :: String
name trans :: Alias
trans Nothing)) = ScalarType -> Field
forall a b. a -> Either a b
Left (ScalarType -> Field) -> ScalarType -> Field
forall a b. (a -> b) -> a -> b
$ Alias -> String -> Alias -> Alias -> ScalarType
ScalarType Alias
alias String
name Alias
trans Alias
forall a. Maybe a
Nothing
replaceSubfieldVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa sobj :: String
sobj vars :: [(String, String, String)]
vars (Left (ScalarType alias :: Alias
alias name :: String
name trans :: Alias
trans (Just arg :: String
arg))) = if Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
isVariable String
arg then ScalarType -> Field
forall a b. a -> Either a b
Left (ScalarType -> Field) -> ScalarType -> Field
forall a b. (a -> b) -> a -> b
$ Alias -> String -> Alias -> Alias -> ScalarType
ScalarType Alias
alias String
name Alias
trans (Alias -> ScalarType) -> Alias -> ScalarType
forall a b. (a -> b) -> a -> b
$ String -> Alias
forall a. a -> Maybe a
Just String
arg else ScalarType -> Field
forall a b. a -> Either a b
Left (ScalarType -> Field) -> ScalarType -> Field
forall a b. (a -> b) -> a -> b
$ Alias -> String -> Alias -> Alias -> ScalarType
ScalarType Alias
alias String
name Alias
trans (Alias -> ScalarType) -> Alias -> ScalarType
forall a b. (a -> b) -> a -> b
$ String -> Alias
forall a. a -> Maybe a
Just (String -> Alias) -> String -> Alias
forall a b. (a -> b) -> a -> b
$ String -> String -> [(String, String, String)] -> String
replaceScalarVariable (String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
getScalarTypeForVariableReplacement String
sobj String
name [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa) String
arg [(String, String, String)]
vars
replaceSubfieldVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa sobj :: String
sobj vars :: [(String, String, String)]
vars (Right (Left (NestedObject alias :: Alias
alias name :: String
name nsobj :: String
nsobj Nothing sfs :: SubFields
sfs))) = Either RootObject InlinefragmentObject -> Field
forall a b. b -> Either a b
Right (Either RootObject InlinefragmentObject -> Field)
-> Either RootObject InlinefragmentObject -> Field
forall a b. (a -> b) -> a -> b
$ RootObject -> Either RootObject InlinefragmentObject
forall a b. a -> Either a b
Left (RootObject -> Either RootObject InlinefragmentObject)
-> RootObject -> Either RootObject InlinefragmentObject
forall a b. (a -> b) -> a -> b
$ Alias
-> String -> String -> Maybe ScalarType -> SubFields -> RootObject
NestedObject Alias
alias String
name String
nsobj Maybe ScalarType
forall a. Maybe a
Nothing [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa String
nsobj [(String, String, String)]
vars Field
sf | Field
sf<-SubFields
sfs]
replaceSubfieldVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa sobj :: String
sobj vars :: [(String, String, String)]
vars (Right (Left (NestedObject alias :: Alias
alias name :: String
name nsobj :: String
nsobj (Just (ScalarType sAlias :: Alias
sAlias sName :: String
sName trans :: Alias
trans Nothing)) sfs :: SubFields
sfs))) = Either RootObject InlinefragmentObject -> Field
forall a b. b -> Either a b
Right (Either RootObject InlinefragmentObject -> Field)
-> Either RootObject InlinefragmentObject -> Field
forall a b. (a -> b) -> a -> b
$ RootObject -> Either RootObject InlinefragmentObject
forall a b. a -> Either a b
Left (RootObject -> Either RootObject InlinefragmentObject)
-> RootObject -> Either RootObject InlinefragmentObject
forall a b. (a -> b) -> a -> b
$ Alias
-> String -> String -> Maybe ScalarType -> SubFields -> RootObject
NestedObject Alias
alias String
name String
nsobj (ScalarType -> Maybe ScalarType
forall a. a -> Maybe a
Just (ScalarType -> Maybe ScalarType) -> ScalarType -> Maybe ScalarType
forall a b. (a -> b) -> a -> b
$ Alias -> String -> Alias -> Alias -> ScalarType
ScalarType Alias
sAlias String
sName Alias
trans Alias
forall a. Maybe a
Nothing) [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa String
nsobj [(String, String, String)]
vars Field
sf | Field
sf<-SubFields
sfs]
replaceSubfieldVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa sobj :: String
sobj vars :: [(String, String, String)]
vars (Right (Left (NestedObject alias :: Alias
alias name :: String
name nsobj :: String
nsobj (Just (ScalarType sAlias :: Alias
sAlias sName :: String
sName trans :: Alias
trans (Just arg :: String
arg))) sfs :: SubFields
sfs))) = if (Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Bool
isVariable String
arg) then Either RootObject InlinefragmentObject -> Field
forall a b. b -> Either a b
Right (Either RootObject InlinefragmentObject -> Field)
-> Either RootObject InlinefragmentObject -> Field
forall a b. (a -> b) -> a -> b
$ RootObject -> Either RootObject InlinefragmentObject
forall a b. a -> Either a b
Left (RootObject -> Either RootObject InlinefragmentObject)
-> RootObject -> Either RootObject InlinefragmentObject
forall a b. (a -> b) -> a -> b
$ Alias
-> String -> String -> Maybe ScalarType -> SubFields -> RootObject
NestedObject Alias
alias String
name String
nsobj (ScalarType -> Maybe ScalarType
forall a. a -> Maybe a
Just (ScalarType -> Maybe ScalarType) -> ScalarType -> Maybe ScalarType
forall a b. (a -> b) -> a -> b
$ Alias -> String -> Alias -> Alias -> ScalarType
ScalarType Alias
sAlias String
sName Alias
trans (Alias -> ScalarType) -> Alias -> ScalarType
forall a b. (a -> b) -> a -> b
$ String -> Alias
forall a. a -> Maybe a
Just String
arg) [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa String
nsobj [(String, String, String)]
vars Field
sf | Field
sf<-SubFields
sfs] else Either RootObject InlinefragmentObject -> Field
forall a b. b -> Either a b
Right (Either RootObject InlinefragmentObject -> Field)
-> Either RootObject InlinefragmentObject -> Field
forall a b. (a -> b) -> a -> b
$ RootObject -> Either RootObject InlinefragmentObject
forall a b. a -> Either a b
Left (RootObject -> Either RootObject InlinefragmentObject)
-> RootObject -> Either RootObject InlinefragmentObject
forall a b. (a -> b) -> a -> b
$ Alias
-> String -> String -> Maybe ScalarType -> SubFields -> RootObject
NestedObject Alias
alias String
name String
nsobj (ScalarType -> Maybe ScalarType
forall a. a -> Maybe a
Just (ScalarType -> Maybe ScalarType) -> ScalarType -> Maybe ScalarType
forall a b. (a -> b) -> a -> b
$ Alias -> String -> Alias -> Alias -> ScalarType
ScalarType Alias
sAlias String
sName Alias
trans (Alias -> ScalarType) -> Alias -> ScalarType
forall a b. (a -> b) -> a -> b
$ String -> Alias
forall a. a -> Maybe a
Just (String -> Alias) -> String -> Alias
forall a b. (a -> b) -> a -> b
$ String -> String -> [(String, String, String)] -> String
replaceScalarVariable (String
-> String
-> [(String,
     [(String, String,
       [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
getScalarTypeForVariableReplacement String
nsobj String
name [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa) String
arg [(String, String, String)]
vars) [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa String
nsobj [(String, String, String)]
vars Field
sf | Field
sf<-SubFields
sfs]
replaceSubfieldVariables sss :: [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss soa :: [(String, [String], [String])]
soa sobj :: String
sobj vars :: [(String, String, String)]
vars (Right (Right (InlinefragmentObject ifsobj :: String
ifsobj sfs :: SubFields
sfs))) = Either RootObject InlinefragmentObject -> Field
forall a b. b -> Either a b
Right (Either RootObject InlinefragmentObject -> Field)
-> Either RootObject InlinefragmentObject -> Field
forall a b. (a -> b) -> a -> b
$ InlinefragmentObject -> Either RootObject InlinefragmentObject
forall a b. b -> Either a b
Right (InlinefragmentObject -> Either RootObject InlinefragmentObject)
-> InlinefragmentObject -> Either RootObject InlinefragmentObject
forall a b. (a -> b) -> a -> b
$ String -> SubFields -> InlinefragmentObject
InlinefragmentObject String
ifsobj [[(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
-> [(String, [String], [String])]
-> String
-> [(String, String, String)]
-> Field
-> Field
replaceSubfieldVariables [(String,
  [(String, String,
    [(String, [(String, String, String, String)])])])]
sss [(String, [String], [String])]
soa String
ifsobj [(String, String, String)]
vars Field
sf | Field
sf<-SubFields
sfs]
isVariable :: String -> Bool
isVariable :: String -> Bool
isVariable = Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem '$'

flagOneWay :: [(String,[String],[String])] -> [RootObject] -> [[FlagNode]]
flagOneWay :: [(String, [String], [String])] -> [RootObject] -> [[FlagNode]]
flagOneWay soa :: [(String, [String], [String])]
soa robjs :: [RootObject]
robjs = (RootObject -> [FlagNode]) -> [RootObject] -> [[FlagNode]]
forall a b. (a -> b) -> [a] -> [b]
map (\(NestedObject _ _ so :: String
so _ sfs :: SubFields
sfs) -> [(String, [String], [String])] -> String -> SubFields -> [FlagNode]
flagOneWayByRootObj [(String, [String], [String])]
soa String
so SubFields
sfs) [RootObject]
robjs
flagOneWayByRootObj :: [(String,[String],[String])] -> ServerObject -> [Field] -> [FlagNode]
flagOneWayByRootObj :: [(String, [String], [String])] -> String -> SubFields -> [FlagNode]
flagOneWayByRootObj soa :: [(String, [String], [String])]
soa so :: String
so sfs :: SubFields
sfs = if [(String, [String], [String])] -> String -> Bool
isInterface [(String, [String], [String])]
soa String
so then [[(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa (Int -> [FlagNode] -> FlagNode
FlagNode 0 []) [] String
nio SubFields
sfs [] | String
nio<-[(String, [String], [String])] -> String -> [String]
translateInterfaceToServerObjects [(String, [String], [String])]
soa String
so] else [[(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa (Int -> [FlagNode] -> FlagNode
FlagNode 0 []) [] String
so SubFields
sfs []]
flagOneWayRootTable :: [(String,[String],[String])] -> FlagNode -> [Int] -> ServerObject -> [Field] -> [(ServerObject,[Field])] -> FlagNode
flagOneWayRootTable :: [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable soa :: [(String, [String], [String])]
soa rsf :: FlagNode
rsf idc :: [Int]
idc so :: String
so ((Left _):sfs :: SubFields
sfs) rem :: [(String, SubFields)]
rem = [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
rsf [Int]
idc String
so SubFields
sfs [(String, SubFields)]
rem
flagOneWayRootTable soa :: [(String, [String], [String])]
soa rsf :: FlagNode
rsf idc :: [Int]
idc so :: String
so ((Right (Left (NestedObject _ _ nso :: String
nso _ nsfs :: SubFields
nsfs))):sfs :: SubFields
sfs) rem :: [(String, SubFields)]
rem
  | Bool
flg Bool -> Bool -> Bool
&& Int
nNios Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 1 = [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
fRlt [Int]
idc String
so SubFields
sfs [(String, SubFields)]
rem
  | Bool
flg Bool -> Bool -> Bool
&& Int
nNios Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> 0 = [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
u1Rlt (Int
rIdxInt -> [Int] -> [Int]
forall a. a -> [a] -> [a]
:[Int]
idc) ([String] -> String
forall a. [a] -> a
head [String]
nios) SubFields
nsfs [(String, SubFields)]
nrem
  | Bool
flg = [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
u0Rlt [Int]
idc String
so SubFields
sfs [(String, SubFields)]
rem -- TODO: make an empty query for interfaces without objects
  | Bool
otherwise = [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
u1Rlt (Int
rIdxInt -> [Int] -> [Int]
forall a. a -> [a] -> [a]
:[Int]
idc) String
nso SubFields
nsfs [(String, SubFields)]
nrem
 where
    nios :: [String]
nios = [(String, [String], [String])] -> String -> [String]
translateInterfaceToServerObjects [(String, [String], [String])]
soa String
nso
    nNios :: Int
nNios = [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
nios
    flg :: Bool
flg = [(String, [String], [String])] -> String -> Bool
isInterface [(String, [String], [String])]
soa String
nso
    u0Rlt :: FlagNode
u0Rlt = Int -> FlagNode -> [Int] -> FlagNode
addNodeAndInc 0 FlagNode
rsf [Int]
idc
    u1Rlt :: FlagNode
u1Rlt = Int -> FlagNode -> [Int] -> FlagNode
addNodeAndInc 1 FlagNode
rsf [Int]
idc
    rIdx :: Int
rIdx = FlagNode -> [Int] -> Int
findNextIndex FlagNode
rsf [Int]
idc
    fRlt :: FlagNode
fRlt = (FlagNode -> (Int, String) -> FlagNode)
-> FlagNode -> [(Int, String)] -> FlagNode
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\nRlt :: FlagNode
nRlt (nIdx :: Int
nIdx,nObj :: String
nObj)->let nU1Rlt :: FlagNode
nU1Rlt = Int -> FlagNode -> [Int] -> FlagNode
addNodeAndInc 1 FlagNode
nRlt [Int]
idc in [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
nU1Rlt (Int
nIdxInt -> [Int] -> [Int]
forall a. a -> [a] -> [a]
:[Int]
idc) String
nObj SubFields
nsfs []) FlagNode
rsf ([(Int, String)] -> FlagNode) -> [(Int, String)] -> FlagNode
forall a b. (a -> b) -> a -> b
$ [Int] -> [String] -> [(Int, String)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Int
rIdx..] [String]
nios
    nrem :: [(String, SubFields)]
nrem = (String
so,SubFields
sfs)(String, SubFields)
-> [(String, SubFields)] -> [(String, SubFields)]
forall a. a -> [a] -> [a]
:[(String, SubFields)]
rem
flagOneWayRootTable soa :: [(String, [String], [String])]
soa rsf :: FlagNode
rsf idc :: [Int]
idc so :: String
so ((Right (Right (InlinefragmentObject nso :: String
nso nsfs :: SubFields
nsfs))):sfs :: SubFields
sfs) rem :: [(String, SubFields)]
rem = if String
soString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
nso then [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
rsf [Int]
idc String
so (SubFields
nsfsSubFields -> SubFields -> SubFields
forall a. [a] -> [a] -> [a]
++SubFields
sfs) [(String, SubFields)]
rem else [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
rsf [Int]
idc String
so SubFields
sfs [(String, SubFields)]
rem
flagOneWayRootTable soa :: [(String, [String], [String])]
soa rsf :: FlagNode
rsf idc :: [Int]
idc so :: String
so [] ((nso :: String
nso,nsfs :: SubFields
nsfs):rem :: [(String, SubFields)]
rem) = [(String, [String], [String])]
-> FlagNode
-> [Int]
-> String
-> SubFields
-> [(String, SubFields)]
-> FlagNode
flagOneWayRootTable [(String, [String], [String])]
soa FlagNode
rsf ([Int] -> [Int]
forall a. [a] -> [a]
tail [Int]
idc) String
nso SubFields
nsfs [(String, SubFields)]
rem
flagOneWayRootTable soa :: [(String, [String], [String])]
soa rsf :: FlagNode
rsf idc :: [Int]
idc so :: String
so [] [] = FlagNode
rsf
addNodeAndInc :: Int -> FlagNode -> [Int] -> FlagNode
addNodeAndInc :: Int -> FlagNode -> [Int] -> FlagNode
addNodeAndInc inc :: Int
inc rsf :: FlagNode
rsf idx :: [Int]
idx = Int -> FlagNode -> [Int] -> FlagNode
updateNodeValues Int
nVal FlagNode
nTree [Int]
idx
    where
        nTree :: FlagNode
nTree = Int -> FlagNode -> [Int] -> FlagNode
addNodeWithInc Int
inc FlagNode
rsf [Int]
idx
        nVal :: Int
nVal = FlagNode -> [Int] -> Int
findNewVal FlagNode
nTree [Int]
idx
addNodeWithInc :: Int -> FlagNode -> [Int] -> FlagNode
addNodeWithInc :: Int -> FlagNode -> [Int] -> FlagNode
addNodeWithInc inc :: Int
inc (FlagNode val :: Int
val nds :: [FlagNode]
nds) [] = Int -> [FlagNode] -> FlagNode
FlagNode (Int
valInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
inc) ([FlagNode]
nds[FlagNode] -> [FlagNode] -> [FlagNode]
forall a. [a] -> [a] -> [a]
++[Int -> [FlagNode] -> FlagNode
FlagNode 0 []])
addNodeWithInc inc :: Int
inc (FlagNode val :: Int
val nds :: [FlagNode]
nds) (h :: Int
h:t :: [Int]
t) = Int -> [FlagNode] -> FlagNode
FlagNode Int
val [if Int
nIdxInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/=Int
h then FlagNode
nNode else Int -> FlagNode -> [Int] -> FlagNode
addNodeWithInc Int
inc FlagNode
nNode [Int]
t | (nIdx :: Int
nIdx,nNode :: FlagNode
nNode)<-[Int] -> [FlagNode] -> [(Int, FlagNode)]
forall a b. [a] -> [b] -> [(a, b)]
zip [0..] [FlagNode]
nds]
findNewVal :: FlagNode -> [Int] -> Int
findNewVal :: FlagNode -> [Int] -> Int
findNewVal (FlagNode val :: Int
val _) [] = Int
val
findNewVal (FlagNode _ nds :: [FlagNode]
nds) (h :: Int
h:t :: [Int]
t) = FlagNode -> [Int] -> Int
findNewVal ([FlagNode] -> Int -> FlagNode
forall a. [a] -> Int -> a
(!!) [FlagNode]
nds Int
h) [Int]
t
updateNodeValues :: Int -> FlagNode -> [Int] -> FlagNode
updateNodeValues :: Int -> FlagNode -> [Int] -> FlagNode
updateNodeValues nVal :: Int
nVal (FlagNode val :: Int
val nds :: [FlagNode]
nds) (h :: Int
h:t :: [Int]
t) = Int -> [FlagNode] -> FlagNode
FlagNode (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
nVal Int
val) [if Int
nIdxInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/=Int
h then FlagNode
nNode else Int -> FlagNode -> [Int] -> FlagNode
updateNodeValues Int
nVal FlagNode
nNode [Int]
t | (nIdx :: Int
nIdx,nNode :: FlagNode
nNode)<-[Int] -> [FlagNode] -> [(Int, FlagNode)]
forall a b. [a] -> [b] -> [(a, b)]
zip [0..] [FlagNode]
nds]
updateNodeValues nVal :: Int
nVal (FlagNode val :: Int
val nds :: [FlagNode]
nds) [] = Int -> [FlagNode] -> FlagNode
FlagNode (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
nVal Int
val) [FlagNode]
nds
findNextIndex :: FlagNode -> [Int] -> Int
findNextIndex :: FlagNode -> [Int] -> Int
findNextIndex (FlagNode _ nds :: [FlagNode]
nds) (h :: Int
h:t :: [Int]
t) = FlagNode -> [Int] -> Int
findNextIndex ([FlagNode] -> Int -> FlagNode
forall a. [a] -> Int -> a
(!!) [FlagNode]
nds Int
h) [Int]
t
findNextIndex (FlagNode _ nds :: [FlagNode]
nds) [] = [FlagNode] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [FlagNode]
nds