module Components.Parsers.QueryParser (processString,validateQuery,parseStringToObjects) where

import Components.ObjectHandlers.ObjectsHandler (readServerObject, readFieldObject)
import Control.Exception (throw)
import Data.Char (toLower)
import Data.Foldable (foldl')
import Model.ServerExceptions (
    QueryException(
      ParseFragmentException,
      EmptyQueryException,
      InvalidObjectException,
      FindFragmentException,
      ReadDirectiveException,
      MismatchedVariableTypeException,
      InvalidVariableNameException,
      InvalidScalarException,
      TransformationSyntaxException 
    )
  )
import Model.ServerObjectTypes (
    NestedObject(..),
    ServerObject,
    Alias,
    Name,
    Argument,
    Transformation,
    ScalarType(..),
    RootObjects,
    RootObject,
    SubFields,
    InlinefragmentObject(..),
    Field,
    FieldObject,
    SubSelection,
    Fragment(..)
  )


{-----Step 1. PROCESSING-----}
processString :: String -> String
processString :: String -> String
processString str :: String
str = String -> String
removeComments (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> String
removeLinebreaks String
str
-- REQUIREMENTS: Windows and Mac are one of \r\n, \n, or \r to make a new line break. Another OS is maybe different.
removeComments :: String -> String
removeComments :: String -> String
removeComments str :: String
str = String -> Bool -> String
removeCommentsHelper String
str Bool
False
removeCommentsHelper :: String -> Bool -> String
removeCommentsHelper :: String -> Bool -> String
removeCommentsHelper ('#':t :: String
t) _ = String -> Bool -> String
removeCommentsHelper String
t Bool
True
removeCommentsHelper ('\n':t :: String
t) _ = '\n'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> Bool -> String
removeCommentsHelper String
t Bool
False
removeCommentsHelper (h :: Char
h:t :: String
t) False = Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String -> Bool -> String
removeCommentsHelper String
t Bool
False
removeCommentsHelper (_:t :: String
t) _ = String -> Bool -> String
removeCommentsHelper String
t Bool
True
removeCommentsHelper "" _ = ""
-- NOTE: this is used with only the textarea field of forms since they are giving line breaks these combinations...
removeLinebreaks :: String -> String
removeLinebreaks :: String -> String
removeLinebreaks ('\n':t :: String
t) = ' 'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
removeLinebreaks String
t
removeLinebreaks ('\r':t :: String
t) = String -> String
removeLinebreaks String
t
removeLinebreaks ('\t':t :: String
t) = ' 'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> String
removeLinebreaks String
t
removeLinebreaks (h :: Char
h:t :: String
t) = Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String -> String
removeLinebreaks String
t
removeLinebreaks "" = ""

{-----Step 2. VALIDATION-----}
validateQuery :: String -> Bool
validateQuery :: String -> Bool
validateQuery "" = Bool
False
validateQuery str :: String
str = (String -> Bool
validateBracketLocationQuery String
str)Bool -> Bool -> Bool
&&(String -> Bool
validateNoEmptyBrackets String
str)
-- this is first validation to check that we have equal opening/closing brackets, and we do not close before opening
validateBracketLocationQuery :: String -> Bool
validateBracketLocationQuery :: String -> Bool
validateBracketLocationQuery str :: String
str = String -> Int -> Int -> Bool
validateBracketLocationQueryHelper String
str 0 0
validateBracketLocationQueryHelper :: String -> Int -> Int -> Bool
validateBracketLocationQueryHelper :: String -> Int -> Int -> Bool
validateBracketLocationQueryHelper ('{':t :: String
t) o :: Int
o c :: Int
c = String -> Int -> Int -> Bool
validateBracketLocationQueryHelper String
t (Int
oInt -> Int -> Int
forall a. Num a => a -> a -> a
+1) Int
c
validateBracketLocationQueryHelper ('}':t :: String
t) o :: Int
o c :: Int
c = if Int
oInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=Int
c then Bool
False else String -> Int -> Int -> Bool
validateBracketLocationQueryHelper String
t Int
o (Int
cInt -> Int -> Int
forall a. Num a => a -> a -> a
+1)
validateBracketLocationQueryHelper (_:t :: String
t) o :: Int
o c :: Int
c = String -> Int -> Int -> Bool
validateBracketLocationQueryHelper String
t Int
o Int
c
validateBracketLocationQueryHelper "" x :: Int
x y :: Int
y = (Int
xInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
y)
validateNoEmptyBrackets :: String -> Bool
validateNoEmptyBrackets :: String -> Bool
validateNoEmptyBrackets str :: String
str = String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper String
str "" []
validateNoEmptyBracketsHelper :: String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper :: String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper (' ':b :: String
b) acc :: String
acc [] = String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper String
b String
acc []
validateNoEmptyBracketsHelper (' ':b :: String
b) acc :: String
acc (i :: String
i:j :: [String]
j) = String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper String
b String
acc (String
iString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
j)
validateNoEmptyBracketsHelper ('{':b :: String
b) acc :: String
acc [] = String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper String
b [] [String
acc]
validateNoEmptyBracketsHelper ('}':b :: String
b) acc :: String
acc [] = Bool
False
validateNoEmptyBracketsHelper (a :: Char
a:b :: String
b) acc :: String
acc [] = String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper String
b (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
a]) []
validateNoEmptyBracketsHelper ('{':b :: String
b) acc :: String
acc (i :: String
i:j :: [String]
j) = if Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
(==) 0 (Int -> Bool) -> Int -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc then Bool
False else String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper String
b [] (String
accString -> [String] -> [String]
forall a. a -> [a] -> [a]
:String
iString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
j)
validateNoEmptyBracketsHelper ('}':b :: String
b) acc :: String
acc (i :: String
i:j :: [String]
j) = if Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
(==) 0 (Int -> Bool) -> Int -> Bool
forall a b. (a -> b) -> a -> b
$ String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc then Bool
False else String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper String
b String
i [String]
j
validateNoEmptyBracketsHelper (a :: Char
a:b :: String
b) acc :: String
acc (i :: String
i:j :: [String]
j) = String -> String -> [String] -> Bool
validateNoEmptyBracketsHelper String
b (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
a]) (String
iString -> [String] -> [String]
forall a. a -> [a] -> [a]
:[String]
j)
validateNoEmptyBracketsHelper "" acc :: String
acc nst :: [String]
nst = Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(>) 1 (Int -> Bool) -> Int -> Bool
forall a b. (a -> b) -> a -> b
$ [String] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
nst


{-----Step 3. PARSING-----}
parseStringToObjects :: String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> [(String,String,String)] -> RootObjects
parseStringToObjects :: String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> RootObjects
parseStringToObjects [] _ _ _ _ = QueryException -> RootObjects
forall a e. Exception e => e -> a
throw QueryException
EmptyQueryException
parseStringToObjects str :: String
str svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars = String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
composeObjects String
qry [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fragments
  where
    (qry :: String
qry,fmts :: String
fmts) = String -> (String, String)
getQueryAndFragments String
str
    fragments :: [Fragment]
fragments = String
-> [(String, [String])]
-> [(String, [String], [String])]
-> [Fragment]
parseFragments String
fmts [(String, [String])]
svrobjs [(String, [String], [String])]
soa
-- REQUIRES: curly braces are in correct order
getQueryAndFragments :: String -> (String, String)
getQueryAndFragments :: String -> (String, String)
getQueryAndFragments str :: String
str = String -> Int -> Bool -> String -> String -> (String, String)
getQueryAndFragmentsHelper String
str 0 Bool
False "" ""
getQueryAndFragmentsHelper :: String -> Int -> Bool -> String -> String -> (String, String)
getQueryAndFragmentsHelper :: String -> Int -> Bool -> String -> String -> (String, String)
getQueryAndFragmentsHelper ('{':t :: String
t) l :: Int
l False q :: String
q f :: String
f = String -> Int -> Bool -> String -> String -> (String, String)
getQueryAndFragmentsHelper String
t (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
+1) Bool
False (String
qString -> String -> String
forall a. [a] -> [a] -> [a]
++"{") String
f
getQueryAndFragmentsHelper ('}':t :: String
t) 1 False q :: String
q f :: String
f = String -> Int -> Bool -> String -> String -> (String, String)
getQueryAndFragmentsHelper String
t 0 Bool
True (String
qString -> String -> String
forall a. [a] -> [a] -> [a]
++"}") String
f
getQueryAndFragmentsHelper ('}':t :: String
t) l :: Int
l False q :: String
q f :: String
f = String -> Int -> Bool -> String -> String -> (String, String)
getQueryAndFragmentsHelper String
t (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
-1) Bool
False (String
qString -> String -> String
forall a. [a] -> [a] -> [a]
++"}") String
f
getQueryAndFragmentsHelper (h :: Char
h:t :: String
t) l :: Int
l False q :: String
q f :: String
f = String -> Int -> Bool -> String -> String -> (String, String)
getQueryAndFragmentsHelper String
t Int
l Bool
False (String
qString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) String
f
getQueryAndFragmentsHelper (h :: Char
h:t :: String
t) l :: Int
l m :: Bool
m q :: String
q f :: String
f = String -> Int -> Bool -> String -> String -> (String, String)
getQueryAndFragmentsHelper String
t Int
l Bool
m String
q (String
fString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h])
getQueryAndFragmentsHelper "" _ _ x :: String
x y :: String
y = (String
x, String
y)
parseFragments :: String -> [(String,[String])] -> [(String,[String],[String])] -> [Fragment]
parseFragments :: String
-> [(String, [String])]
-> [(String, [String], [String])]
-> [Fragment]
parseFragments str :: String
str svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> String
-> Int
-> [Fragment]
-> [(String, [String])]
-> [(String, [String], [String])]
-> [Fragment]
parseFragmentsHelper String
str "" 0 [] [(String, [String])]
svrobjs [(String, [String], [String])]
soa
parseFragmentsHelper :: String -> String -> Int -> [Fragment] -> [(String,[String])] -> [(String,[String],[String])] -> [Fragment]
parseFragmentsHelper :: String
-> String
-> Int
-> [Fragment]
-> [(String, [String])]
-> [(String, [String], [String])]
-> [Fragment]
parseFragmentsHelper ('{':t :: String
t) acc :: String
acc l :: Int
l rslt :: [Fragment]
rslt svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> String
-> Int
-> [Fragment]
-> [(String, [String])]
-> [(String, [String], [String])]
-> [Fragment]
parseFragmentsHelper String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"{") (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
+1) [Fragment]
rslt [(String, [String])]
svrobjs [(String, [String], [String])]
soa
parseFragmentsHelper ('}':t :: String
t) acc :: String
acc 1 rslt :: [Fragment]
rslt svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> String
-> Int
-> [Fragment]
-> [(String, [String])]
-> [(String, [String], [String])]
-> [Fragment]
parseFragmentsHelper String
t [] 0 ((String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragment String
acc [(String, [String])]
svrobjs [(String, [String], [String])]
soa)Fragment -> [Fragment] -> [Fragment]
forall a. a -> [a] -> [a]
:[Fragment]
rslt) [(String, [String])]
svrobjs [(String, [String], [String])]
soa -- completed one fragment
parseFragmentsHelper ('}':t :: String
t) acc :: String
acc l :: Int
l rslt :: [Fragment]
rslt svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> String
-> Int
-> [Fragment]
-> [(String, [String])]
-> [(String, [String], [String])]
-> [Fragment]
parseFragmentsHelper String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"}") (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
-1) [Fragment]
rslt [(String, [String])]
svrobjs [(String, [String], [String])]
soa  -- closed a nested object
parseFragmentsHelper (h :: Char
h:t :: String
t) acc :: String
acc l :: Int
l rslt :: [Fragment]
rslt svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> String
-> Int
-> [Fragment]
-> [(String, [String])]
-> [(String, [String], [String])]
-> [Fragment]
parseFragmentsHelper String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) Int
l [Fragment]
rslt [(String, [String])]
svrobjs [(String, [String], [String])]
soa
parseFragmentsHelper "" _ _ rslt :: [Fragment]
rslt _ _ = [Fragment]
rslt
-- with a fragment string that is without closing curly braces, we want a fragments
createFragment :: String -> [(String,[String])] -> [(String,[String],[String])] -> Fragment
createFragment :: String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragment str :: String
str svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
str 0 [] Bool
False Bool
False Bool
False Bool
False "" "" [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper :: String -> Int -> String -> Bool -> Bool -> Bool -> Bool -> String -> String -> [(String,[String])] -> [(String,[String],[String])] -> Fragment
createFragmentHelper :: String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper (' ':t :: String
t) 0 acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t 0 "" Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('{':t :: String
t) 0 acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t 1 "" Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (_:_) 0 _ True True True True _ _ _ _ = QueryException -> Fragment
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
createFragmentHelper ('{':t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
+1) (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"{") Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('}':t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
-1) (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"}") Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (' ':t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++" ") Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (')':t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++")") Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('(':t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"(") Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (':':t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++":") Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('$':t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"$") Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('@':t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"@") Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (h :: Char
h:t :: String
t) l :: Int
l acc :: String
acc True True True True rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) Bool
True Bool
True Bool
True Bool
True String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (' ':t :: String
t) l :: Int
l "" True False a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "" Bool
True Bool
False Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (' ':t :: String
t) l :: Int
l acc :: String
acc True False a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "" Bool
True Bool
True Bool
a Bool
o String
acc String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (h :: Char
h:t :: String
t) l :: Int
l acc :: String
acc True False a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = if (Char -> Bool
isValidFragmentNameChar Char
h)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
False then QueryException -> Fragment
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException else String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) Bool
True Bool
False Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (' ':t :: String
t) l :: Int
l "" True True True False rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "" Bool
True Bool
True Bool
True Bool
False String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (h :: Char
h:t :: String
t) l :: Int
l "" True True True False rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = if (Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
h)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=97Bool -> Bool -> Bool
||(Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
h)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=122 then String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l [Char
h] Bool
True Bool
True Bool
True Bool
False String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa else QueryException -> Fragment
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
createFragmentHelper (' ':t :: String
t) l :: Int
l acc :: String
acc True True True False rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "" Bool
True Bool
True Bool
True Bool
True String
rst1 String
acc [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('{':t :: String
t) l :: Int
l acc :: String
acc True True True False rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
+1) "" Bool
True Bool
True Bool
True Bool
True String
rst1 String
acc [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (h :: Char
h:t :: String
t) l :: Int
l acc :: String
acc True True True False rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = if Char -> Bool
isValidIdentifierChar Char
h then String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) Bool
True Bool
True Bool
True Bool
False String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa else QueryException -> Fragment
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
createFragmentHelper ('f':t :: String
t) l :: Int
l "" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "f" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('r':t :: String
t) l :: Int
l "f" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "fr" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('a':t :: String
t) l :: Int
l "fr" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "fra" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('g':t :: String
t) l :: Int
l "fra" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "frag" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('m':t :: String
t) l :: Int
l "frag" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "fragm" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('e':t :: String
t) l :: Int
l "fragm" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "fragme" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('n':t :: String
t) l :: Int
l "fragme" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "fragmen" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('t':t :: String
t) l :: Int
l "fragmen" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "fragment" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (' ':t :: String
t) l :: Int
l "fragment" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "" Bool
True Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (' ':t :: String
t) l :: Int
l "" False n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "" Bool
False Bool
n Bool
a Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (_:_) _ _ False _ _ _ _ _ _ _ = QueryException -> Fragment
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
createFragmentHelper (' ':t :: String
t) l :: Int
l "" True True False o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "" Bool
True Bool
True Bool
False Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (' ':t :: String
t) l :: Int
l "on" True True False o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l "" Bool
True Bool
True Bool
True Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (' ':_) _ _ True True False _ _ _ _ _ = QueryException -> Fragment
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
createFragmentHelper ('o':t :: String
t) l :: Int
l acc :: String
acc True True False o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"o") Bool
True Bool
True Bool
False Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper ('n':t :: String
t) l :: Int
l acc :: String
acc True True False o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = String
-> Int
-> String
-> Bool
-> Bool
-> Bool
-> Bool
-> String
-> String
-> [(String, [String])]
-> [(String, [String], [String])]
-> Fragment
createFragmentHelper String
t Int
l (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"n") Bool
True Bool
True Bool
False Bool
o String
rst1 String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa
createFragmentHelper (_:_) _ _ True True False _ _ _ _ _ = QueryException -> Fragment
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
createFragmentHelper "" l :: Int
l acc :: String
acc d :: Bool
d n :: Bool
n a :: Bool
a o :: Bool
o rst1 :: String
rst1 rst2 :: String
rst2 svrobjs :: [(String, [String])]
svrobjs soa :: [(String, [String], [String])]
soa = if (Int
lInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==1Bool -> Bool -> Bool
&&Bool
dBool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
TrueBool -> Bool -> Bool
&&Bool
nBool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
TrueBool -> Bool -> Bool
&&Bool
aBool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
TrueBool -> Bool -> Bool
&&Bool
oBool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True) then Fragment :: String -> String -> String -> Fragment
Fragment { name :: String
name=String
rst1,targetObject :: String
targetObject=(String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject String
rst2 [(String, [String])]
svrobjs [(String, [String], [String])]
soa),replacement :: String
replacement=String
acc } else QueryException -> Fragment
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException

-- only names
isValidFragmentNameChar :: Char -> Bool
isValidFragmentNameChar :: Char -> Bool
isValidFragmentNameChar c :: Char
c = let num :: Int
num = Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
c in (Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=65Bool -> Bool -> Bool
&&Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=90)Bool -> Bool -> Bool
||(Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=97Bool -> Bool -> Bool
&&Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=122)Bool -> Bool -> Bool
||(Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=48Bool -> Bool -> Bool
&&Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=57)Bool -> Bool -> Bool
||(Int
numInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==95)
-- variables or names
isValidIdentifierChar :: Char -> Bool
isValidIdentifierChar :: Char -> Bool
isValidIdentifierChar c :: Char
c = let num :: Int
num = Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
c in (Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=65Bool -> Bool -> Bool
&&Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=90)Bool -> Bool -> Bool
||(Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=97Bool -> Bool -> Bool
&&Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=122)Bool -> Bool -> Bool
||(Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=48Bool -> Bool -> Bool
&&Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=57)Bool -> Bool -> Bool
||(Int
numInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==95)Bool -> Bool -> Bool
||(Int
numInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==36)
-- call after infering types on nested objects
-- get block in this scope
splitSubject :: String -> String -> Int -> (String,String)
splitSubject :: String -> String -> Int -> (String, String)
splitSubject (h :: Char
h:t :: String
t) acc :: String
acc l :: Int
l
 | Int
lInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<0 = (String
acc,Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t)
splitSubject ('{':t :: String
t) acc :: String
acc l :: Int
l = String -> String -> Int -> (String, String)
splitSubject String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"{") (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
+1)
splitSubject ('}':t :: String
t) acc :: String
acc l :: Int
l = String -> String -> Int -> (String, String)
splitSubject String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"}") (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
-1)
splitSubject (h :: Char
h:t :: String
t) acc :: String
acc l :: Int
l = String -> String -> Int -> (String, String)
splitSubject String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) Int
l
splitSubject "" acc :: String
acc _ = (String
acc,"")
-- -- substitute target string with replacement string within subject string...return result
-- parse provided string to obtain query
{-
REQUIRES: Query is balanced and ordered brackets.
input is whole query string with opening and closing brackets
EFFECTS: Return value is list of desired objects with specifications
passing code block to separateRootObjects() where code block is not including query opening and closing brackets
-}
composeObjects :: String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> [(String,String,String)] -> [Fragment] -> RootObjects
composeObjects :: String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
composeObjects "" _ _ _ _ _ = QueryException -> RootObjects
forall a e. Exception e => e -> a
throw QueryException
EmptyQueryException
composeObjects str :: String
str svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts = String
-> Int
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
composeObjectsHelper String
str 0 [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts
composeObjectsHelper :: String -> Int -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> [(String,String,String)] -> [Fragment] -> RootObjects
composeObjectsHelper :: String
-> Int
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
composeObjectsHelper ('{':t :: String
t) 0 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts = String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
separateRootObjects (String -> String
extractLevel String
t) [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts -- find and separate every root object
composeObjectsHelper (_:t :: String
t) l :: Int
l svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts = String
-> Int
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
composeObjectsHelper String
t Int
l [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts
composeObjectsHelper "" _ _ _ _ _ _ = QueryException -> RootObjects
forall a e. Exception e => e -> a
throw QueryException
EmptyQueryException
-- ...separate and determine operation
-- REQUIRES: brackets are balanced and ordered
-- NOTE: only querying is first supported; mutations are later
-- EFFECTS: passing block to createNestedObject where block is including opening and closing curly brackets
separateRootObjects :: String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> [(String,String,String)] -> [Fragment] -> [RootObject]
separateRootObjects :: String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
separateRootObjects str :: String
str svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts = String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
separateRootObjectsHelper String
str "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts
separateRootObjectsHelper :: String -> String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> [(String,String,String)] -> [Fragment] -> [RootObject]
separateRootObjectsHelper :: String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
separateRootObjectsHelper ('{':t :: String
t) acc :: String
acc svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts = ((String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> Maybe String
-> NestedObject
createNestedObject (String -> String -> String
forall a. [a] -> [a] -> [a]
(++) String
acc (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ '{'Char -> String -> String
forall a. a -> [a] -> [a]
:String
level) [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts Maybe String
forall a. Maybe a
Nothing) :: RootObject)NestedObject -> RootObjects -> RootObjects
forall a. a -> [a] -> [a]
:String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
separateRootObjectsHelper String
levelTail "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts
  where
    (level :: String
level,levelTail :: String
levelTail) = String -> String -> Int -> (String, String)
splitLevel String
t "" 0
separateRootObjectsHelper (',':t :: String
t) acc :: String
acc svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts = String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
separateRootObjectsHelper String
t String
acc [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts
separateRootObjectsHelper (h :: Char
h:t :: String
t) acc :: String
acc svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts = String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> RootObjects
separateRootObjectsHelper String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts
separateRootObjectsHelper "" _ _ _ _ _ _ = []
-- create root object from block
-- EFFECTS: passing code block to parseSubFields where block is not including root object opening and closing curly brackets.
createNestedObject :: String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> [(String,String,String)] -> [Fragment] -> Maybe ServerObject -> NestedObject
createNestedObject :: String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> Maybe String
-> NestedObject
createNestedObject str :: String
str svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: Maybe String
sobj = String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> Maybe String
-> NestedObject
createNestedObjectHelper String
str "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts Maybe String
sobj
createNestedObjectHelper :: String -> String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> [(String,String,String)] -> [Fragment] -> Maybe ServerObject -> NestedObject
createNestedObjectHelper :: String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> Maybe String
-> NestedObject
createNestedObjectHelper ('{':t :: String
t) acc :: String
acc svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: Maybe String
sobj = Maybe String
-> String -> String -> SubSelection -> SubFields -> NestedObject
NestedObject (String -> Maybe String
parseAlias String
acc) (String -> String
parseName String
acc) String
serverObj (String -> SubSelection
parseSubSelection String
acc) ((String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFields (String -> String
extractLevel String
t) [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts String
serverObj) :: SubFields) :: RootObject
  where
    serverObj :: String
serverObj = String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Maybe String
-> String
parseServerObject String
acc [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Maybe String
sobj
createNestedObjectHelper (h :: Char
h:t :: String
t) acc :: String
acc svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: Maybe String
sobj = String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> Maybe String
-> NestedObject
createNestedObjectHelper String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts Maybe String
sobj
createNestedObjectHelper "" _ _ _ _ _ _ _ = QueryException -> NestedObject
forall a e. Exception e => e -> a
throw QueryException
InvalidObjectException  -- we should not encounter this since we already checked against empty brackets
-- given object header without any braces, we want a name.
parseServerObject :: String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> Maybe ServerObject -> ServerObject
parseServerObject :: String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Maybe String
-> String
parseServerObject "" svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa Nothing = String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject "" [(String, [String])]
svrobjs [(String, [String], [String])]
soa
parseServerObject str :: String
str svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa Nothing
 | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
TrueBool -> Bool -> Bool
&&(Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem '(' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True = String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject (String -> String
removeSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else (String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x])) "" ((Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
=='(' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" String
str)) [(String, [String])]
svrobjs [(String, [String], [String])]
soa
 | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True = String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject (String -> String
removeSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else (String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x])) "" String
str) [(String, [String])]
svrobjs [(String, [String], [String])]
soa
 | Bool
otherwise = String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject (String -> String
removeSpaces String
str) [(String, [String])]
svrobjs [(String, [String], [String])]
soa
parseServerObject "" svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa (Just holder :: String
holder) = String
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> String
-> String
readFieldObject "" [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa String
holder
parseServerObject str :: String
str svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa (Just holder :: String
holder)
 | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
TrueBool -> Bool -> Bool
&&(Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem '(' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True = String
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> String
-> String
readFieldObject (String -> String
removeSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else (String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x])) "" ((Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
=='(' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" String
str)) [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa String
holder
 | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True = String
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> String
-> String
readFieldObject (String -> String
removeSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else (String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x])) "" String
str) [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa String
holder
 | Bool
otherwise = String
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> String
-> String
readFieldObject (String -> String
removeSpaces String
str) [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa String
holder
-- given object header without any braces, we want the alias if there is one.
parseAlias :: String -> Alias
parseAlias :: String -> Maybe String
parseAlias "" = Maybe String
forall a. Maybe a
Nothing :: Alias
parseAlias str :: String
str
    | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str)Bool -> Bool -> Bool
&&(Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem '(' String
str) = String -> Maybe String
parseAlias (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ (Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
=='(' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" String
str
    | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str) = String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String -> String
removeSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" String
str
    | Bool
otherwise = Maybe String
forall a. Maybe a
Nothing :: Alias
parseName :: String -> Name
parseName :: String -> String
parseName "" = ""
parseName str :: String
str
 | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
TrueBool -> Bool -> Bool
&&(Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem '(' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True = String -> String
removeSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else (String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x])) "" ((Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
=='(' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" String
str)
 | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True = String -> String
removeSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else (String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x])) "" String
str
 | Bool
otherwise = String -> String
removeSpaces String
str
parseSubSelection :: String -> SubSelection
parseSubSelection :: String -> SubSelection
parseSubSelection ('(':t :: String
t)
 | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
t)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
TrueBool -> Bool -> Bool
&&(Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ')' String
t)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True = ScalarType -> SubSelection
forall a. a -> Maybe a
Just (Maybe String
-> String -> Maybe String -> Maybe String -> ScalarType
ScalarType (Maybe String
forall a. Maybe a
Nothing :: Alias) ((String -> String
removeSideSpaces ((Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" String
t)) :: Name) (Maybe String
forall a. Maybe a
Nothing :: Transformation) ((String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String -> String
removeSideSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else (String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x])) "" ((Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==')' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" String
t)) :: Argument)) :: SubSelection
parseSubSelection (h :: Char
h:t :: String
t) = String -> SubSelection
parseSubSelection String
t
parseSubSelection "" = SubSelection
forall a. Maybe a
Nothing :: SubSelection
-- REQUIRES: code block on nested object subfields where nested object opening and closing curly brackets are not included
parseSubFields :: String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> [(String,String,String)] -> [Fragment] -> ServerObject -> [Field]
parseSubFields :: String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFields "" _ _ _ _ _ _ = []
parseSubFields str :: String
str svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
str "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
parseSubFieldsHelper :: String -> String -> String -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> Bool -> [(String,String,String)] -> [Fragment] -> ServerObject -> [Field]
parseSubFieldsHelper :: String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper ('{':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa True vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc1)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = (FieldObject -> Either ScalarType FieldObject
forall a b. b -> Either a b
Right (NestedObject -> FieldObject
forall a b. a -> Either a b
Left (String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> Maybe String
-> NestedObject
createNestedObject (String -> String -> String
forall a. [a] -> [a] -> [a]
(++) String
acc1 (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ '{'Char -> String -> String
forall a. a -> [a] -> [a]
:String
level) [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts (String -> Maybe String
forall a. a -> Maybe a
Just String
sobj)) :: FieldObject) :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
levelTail "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = (FieldObject -> Either ScalarType FieldObject
forall a b. b -> Either a b
Right (NestedObject -> FieldObject
forall a b. a -> Either a b
Left (String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> Maybe String
-> NestedObject
createNestedObject (String -> String -> String
forall a. [a] -> [a] -> [a]
(++) String
acc2 (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ '{'Char -> String -> String
forall a. a -> [a] -> [a]
:String
level) [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts (String -> Maybe String
forall a. a -> Maybe a
Just String
sobj)) :: FieldObject) :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
levelTail "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj    
  where
    (level :: String
level,levelTail :: String
levelTail) = String -> String -> Int -> (String, String)
splitLevel String
t "" 0
parseSubFieldsHelper ('{':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa _ vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc1)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
levelTail "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj    
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
levelTail "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
  where
    (level :: String
level,levelTail :: String
levelTail) = String -> String -> Int -> (String, String)
splitLevel String
t "" 0
parseSubFieldsHelper ('}':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa inc :: Bool
inc vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t String
acc1 String
acc2 [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj  -- this character is removed when I pull a level
parseSubFieldsHelper (':':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa inc :: Bool
inc vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper (String -> String
removeLeadingSpaces String
t) (String
acc2String -> String -> String
forall a. [a] -> [a] -> [a]
++String
acc1String -> String -> String
forall a. [a] -> [a] -> [a]
++":") "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj
parseSubFieldsHelper (' ':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa inc :: Bool
inc vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj = if (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc1)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 then String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t "" String
acc1 [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj else String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t String
acc1 String
acc2 [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj
parseSubFieldsHelper (',':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa True vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj
 | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc1)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = (ScalarType -> Either ScalarType FieldObject
forall a b. a -> Either a b
Left (ScalarType -> Either ScalarType FieldObject)
-> ScalarType -> Either ScalarType FieldObject
forall a b. (a -> b) -> a -> b
$ String -> ScalarType
createScalarType String
acc1 :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
 | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = (ScalarType -> Either ScalarType FieldObject
forall a b. a -> Either a b
Left (ScalarType -> Either ScalarType FieldObject)
-> ScalarType -> Either ScalarType FieldObject
forall a b. (a -> b) -> a -> b
$ String -> ScalarType
createScalarType String
acc2 :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj  -- if acc is not empty, I assume that acc1 is empty
parseSubFieldsHelper (',':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa inc :: Bool
inc vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj
 | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc1)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
 | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
 | Bool
otherwise = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t String
acc1 String
acc2 [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj
parseSubFieldsHelper ('(':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa inc :: Bool
inc vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc1)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
selectTail (String -> String -> String
forall a. [a] -> [a] -> [a]
(++) String
acc1 (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ '('Char -> String -> String
forall a. a -> [a] -> [a]
:String
subselect) "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
selectTail (String -> String -> String
forall a. [a] -> [a] -> [a]
(++) String
acc2 (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ '('Char -> String -> String
forall a. a -> [a] -> [a]
:String
subselect) "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj
  where
    (subselect :: String
subselect,selectTail :: String
selectTail) = String -> (String, String)
getSubSelection String
t
parseSubFieldsHelper ('@':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa _ vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj = if Bool
directive then String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
directiveTail String
acc1 String
acc2 [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj else String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
directiveTail String
acc1 String
acc2 [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
False [(String, String, String)]
vars [Fragment]
fmts String
sobj
  where
    (directive :: Bool
directive,directiveTail :: String
directiveTail) = String -> [(String, String, String)] -> (Bool, String)
checkDirective ('@'Char -> String -> String
forall a. a -> [a] -> [a]
:String
t) [(String, String, String)]
vars  
parseSubFieldsHelper ('.':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa True vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = if Bool
isInlineFragment then (ScalarType -> Either ScalarType FieldObject
forall a b. a -> Either a b
Left (ScalarType -> Either ScalarType FieldObject)
-> ScalarType -> Either ScalarType FieldObject
forall a b. (a -> b) -> a -> b
$ String -> ScalarType
createScalarType String
acc2 :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:(FieldObject -> Either ScalarType FieldObject
forall a b. b -> Either a b
Right (InlinefragmentObject -> FieldObject
forall a b. b -> Either a b
Right (String
-> String
-> [(String, String, String)]
-> [Fragment]
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> InlinefragmentObject
createInlinefragmentObject String
inlinefragmentBody String
inlinefragmentObj [(String, String, String)]
vars [Fragment]
fmts [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa) :: FieldObject) :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
inlinefragmentTail "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj else String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper (String
fContentsString -> String -> String
forall a. [a] -> [a] -> [a]
++String
fragmentTail) "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
  where
    (isInlineFragment :: Bool
isInlineFragment,inlinefragmentObj :: String
inlinefragmentObj,inlinefragmentBody :: String
inlinefragmentBody,inlinefragmentTail :: String
inlinefragmentTail) = String -> (Bool, String, String, String)
checkInlinefragment ('.'Char -> String -> String
forall a. a -> [a] -> [a]
:String
t)
    (fragmentName :: String
fragmentName,fragmentTail :: String
fragmentTail) = String -> (String, String)
findFragment ('.'Char -> String -> String
forall a. a -> [a] -> [a]
:String
t)
    fContents :: String
fContents = String -> String -> [Fragment] -> String
expandFragment String
fragmentName String
sobj [Fragment]
fmts
parseSubFieldsHelper ('.':t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa inc :: Bool
inc vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc1)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t (String
acc1String -> String -> String
forall a. [a] -> [a] -> [a]
++".") "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
    | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = if Bool
isInlineFragment then (FieldObject -> Either ScalarType FieldObject
forall a b. b -> Either a b
Right (InlinefragmentObject -> FieldObject
forall a b. b -> Either a b
Right (String
-> String
-> [(String, String, String)]
-> [Fragment]
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> InlinefragmentObject
createInlinefragmentObject String
inlinefragmentBody String
inlinefragmentObj [(String, String, String)]
vars [Fragment]
fmts [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa) :: FieldObject) :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
inlinefragmentTail "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj else String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper (String
fContentsString -> String -> String
forall a. [a] -> [a] -> [a]
++String
fragmentTail) "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj
    | Bool
isInlineFragmentBool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
True = (FieldObject -> Either ScalarType FieldObject
forall a b. b -> Either a b
Right (InlinefragmentObject -> FieldObject
forall a b. b -> Either a b
Right (String
-> String
-> [(String, String, String)]
-> [Fragment]
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> InlinefragmentObject
createInlinefragmentObject String
inlinefragmentBody String
inlinefragmentObj [(String, String, String)]
vars [Fragment]
fmts [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa) :: FieldObject) :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
inlinefragmentTail "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj
    | Bool
otherwise = String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper (String
fContentsString -> String -> String
forall a. [a] -> [a] -> [a]
++String
fragmentTail) "" "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj
  where
    (isInlineFragment :: Bool
isInlineFragment,inlinefragmentObj :: String
inlinefragmentObj,inlinefragmentBody :: String
inlinefragmentBody,inlinefragmentTail :: String
inlinefragmentTail) = String -> (Bool, String, String, String)
checkInlinefragment ('.'Char -> String -> String
forall a. a -> [a] -> [a]
:String
t)
    (fragmentName :: String
fragmentName,fragmentTail :: String
fragmentTail) = String -> (String, String)
findFragment ('.'Char -> String -> String
forall a. a -> [a] -> [a]
:String
t)
    fContents :: String
fContents = String -> String -> [Fragment] -> String
expandFragment String
fragmentName String
sobj [Fragment]
fmts
parseSubFieldsHelper (h :: Char
h:t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa True vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj
 | (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 = (ScalarType -> Either ScalarType FieldObject
forall a b. a -> Either a b
Left (ScalarType -> Either ScalarType FieldObject)
-> ScalarType -> Either ScalarType FieldObject
forall a b. (a -> b) -> a -> b
$ String -> ScalarType
createScalarType String
acc2 :: Field)Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t (String
acc1String -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj   
parseSubFieldsHelper (h :: Char
h:t :: String
t) acc1 :: String
acc1 acc2 :: String
acc2 svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa inc :: Bool
inc vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts sobj :: String
sobj = if (String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
acc2)Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>0 then String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t (String
acc1String -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
True [(String, String, String)]
vars [Fragment]
fmts String
sobj else String
-> String
-> String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> Bool
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFieldsHelper String
t (String
acc1String -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) "" [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa Bool
inc [(String, String, String)]
vars [Fragment]
fmts String
sobj
parseSubFieldsHelper "" "" "" _ _ _ _ _ _ _ = []
parseSubFieldsHelper "" "" acc :: String
acc _ _ _ True _ _ _ = [(ScalarType -> Either ScalarType FieldObject
forall a b. a -> Either a b
Left (ScalarType -> Either ScalarType FieldObject)
-> ScalarType -> Either ScalarType FieldObject
forall a b. (a -> b) -> a -> b
$ String -> ScalarType
createScalarType String
acc) :: Field]
parseSubFieldsHelper "" "" acc :: String
acc _ _ _ False _ _ _ = []
parseSubFieldsHelper "" acc :: String
acc "" _ _ _ True _ _ _ = [(ScalarType -> Either ScalarType FieldObject
forall a b. a -> Either a b
Left (ScalarType -> Either ScalarType FieldObject)
-> ScalarType -> Either ScalarType FieldObject
forall a b. (a -> b) -> a -> b
$ String -> ScalarType
createScalarType String
acc) :: Field]
parseSubFieldsHelper "" acc :: String
acc "" _ _ _ False _ _ _ = []
-- There is not a case where both acc1 and acc2 are not empty, but I'll catch anyway
parseSubFieldsHelper "" acc1 :: String
acc1 acc2 :: String
acc2 _ _ _ True _ _ _ = (ScalarType -> Either ScalarType FieldObject
forall a b. a -> Either a b
Left (ScalarType -> Either ScalarType FieldObject)
-> ScalarType -> Either ScalarType FieldObject
forall a b. (a -> b) -> a -> b
$ String -> ScalarType
createScalarType (String
acc2String -> String -> String
forall a. [a] -> [a] -> [a]
++String
acc1))Either ScalarType FieldObject -> SubFields -> SubFields
forall a. a -> [a] -> [a]
:[]
parseSubFieldsHelper "" acc1 :: String
acc1 acc2 :: String
acc2 _ _ _ False _ _ _ = []
 

checkInlinefragment :: String -> (Bool,String,String,String)
checkInlinefragment :: String -> (Bool, String, String, String)
checkInlinefragment str :: String
str = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
str "" Bool
False ""
checkInlinefragmentHelper :: String -> String -> Bool -> String -> (Bool,String,String,String)
checkInlinefragmentHelper :: String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper ('.':t :: String
t) "" sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t "." Bool
False ""
checkInlinefragmentHelper _ "" _ _ = QueryException -> (Bool, String, String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
checkInlinefragmentHelper ('.':t :: String
t) "." sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t ".." Bool
False ""
checkInlinefragmentHelper _ "." _ _ = QueryException -> (Bool, String, String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
checkInlinefragmentHelper ('.':t :: String
t) ".." sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t "..." Bool
False ""
checkInlinefragmentHelper _ ".." _ _ = QueryException -> (Bool, String, String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
checkInlinefragmentHelper (' ':t :: String
t) "..." sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t "... " Bool
False ""
checkInlinefragmentHelper (h :: Char
h:t :: String
t) "..." sobj :: Bool
sobj obj :: String
obj = (Bool
False,"","","..."String -> String -> String
forall a. [a] -> [a] -> [a]
++(Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t))
checkInlinefragmentHelper (' ':t :: String
t) "... " sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t "... " Bool
False ""
checkInlinefragmentHelper ('o':t :: String
t) "... " sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t "... o" Bool
False ""
checkInlinefragmentHelper _ "... " _ _ = QueryException -> (Bool, String, String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
checkInlinefragmentHelper ('n':t :: String
t) "... o" sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t "... on" Bool
False ""
checkInlinefragmentHelper _ "... o" _ _ = QueryException -> (Bool, String, String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
checkInlinefragmentHelper (' ':t :: String
t) "... on" sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t "... on " Bool
False ""
checkInlinefragmentHelper _ "... on" _ _ = QueryException -> (Bool, String, String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
checkInlinefragmentHelper (' ':t :: String
t) "... on " sobj :: Bool
sobj obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t "... on " Bool
False ""
checkInlinefragmentHelper (h :: Char
h:t :: String
t) "... on " sobj :: Bool
sobj obj :: String
obj
  | (Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>=97Bool -> Bool -> Bool
||Int
numInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<=122) = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t ("... on "String -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) Bool
False [Char
h]
  | Bool
otherwise = QueryException -> (Bool, String, String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
 where
  num :: Int
num = Char -> Int
forall a. Enum a => a -> Int
fromEnum Char
h
checkInlinefragmentHelper (h :: Char
h:t :: String
t) acc :: String
acc False obj :: String
obj
 | Char -> Bool
isValidIdentifierChar Char
h = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t String
acc Bool
False (String
objString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h])
checkInlinefragmentHelper (' ':t :: String
t) acc :: String
acc False obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t String
acc Bool
True String
obj
checkInlinefragmentHelper (' ':t :: String
t) acc :: String
acc _ obj :: String
obj = String
-> String -> Bool -> String -> (Bool, String, String, String)
checkInlinefragmentHelper String
t String
acc Bool
True String
obj
checkInlinefragmentHelper ('{':t :: String
t) acc :: String
acc _ obj :: String
obj = (Bool
True,String
obj,String
contents,String
tail)
  where
    (contents :: String
contents,tail :: String
tail) = String -> String -> Int -> (String, String)
splitSubject String
t "" 0
checkInlinefragmentHelper "" _ _ _ = (Bool
False,"","","")
checkInlinefragmentHelper _ _ _ _ = QueryException -> (Bool, String, String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
    
createInlinefragmentObject :: String -> String -> [(String,String,String)] -> [Fragment] -> [(String,[String])] -> [(String,[(String,[String])])] -> [(String,[String],[String])] -> InlinefragmentObject
createInlinefragmentObject :: String
-> String
-> [(String, String, String)]
-> [Fragment]
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> InlinefragmentObject
createInlinefragmentObject bdy :: String
bdy obj :: String
obj vars :: [(String, String, String)]
vars fmts :: [Fragment]
fmts svrobjs :: [(String, [String])]
svrobjs sos :: [(String, [(String, [String])])]
sos soa :: [(String, [String], [String])]
soa = String -> SubFields -> InlinefragmentObject
InlinefragmentObject (String
-> [(String, [String])] -> [(String, [String], [String])] -> String
readServerObject String
obj [(String, [String])]
svrobjs [(String, [String], [String])]
soa) ((String
-> [(String, [String])]
-> [(String, [(String, [String])])]
-> [(String, [String], [String])]
-> [(String, String, String)]
-> [Fragment]
-> String
-> SubFields
parseSubFields String
bdy [(String, [String])]
svrobjs [(String, [(String, [String])])]
sos [(String, [String], [String])]
soa [(String, String, String)]
vars [Fragment]
fmts String
obj) :: SubFields)

findFragment :: String -> (String,String)
findFragment :: String -> (String, String)
findFragment "" = QueryException -> (String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
findFragment str :: String
str = String -> String -> (String, String)
findFragmentHelper String
str ""
findFragmentHelper :: String -> String -> (String,String)
findFragmentHelper :: String -> String -> (String, String)
findFragmentHelper (h :: Char
h:t :: String
t) ('.':'.':'.':acc :: String
acc)
 | Char -> Bool
isValidFragmentNameChar Char
h = String -> String -> (String, String)
findFragmentHelper String
t (('.'Char -> String -> String
forall a. a -> [a] -> [a]
:'.'Char -> String -> String
forall a. a -> [a] -> [a]
:'.'Char -> String -> String
forall a. a -> [a] -> [a]
:String
acc)String -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h])
findFragmentHelper ('.':t :: String
t) "" = String -> String -> (String, String)
findFragmentHelper String
t "."
findFragmentHelper (_:_) "" = QueryException -> (String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
findFragmentHelper ('.':t :: String
t) "." = String -> String -> (String, String)
findFragmentHelper String
t ".."
findFragmentHelper (_:_) "." = QueryException -> (String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
findFragmentHelper ('.':t :: String
t) ".." = String -> String -> (String, String)
findFragmentHelper String
t "..."
findFragmentHelper (_:_) ".." = QueryException -> (String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
findFragmentHelper (' ':t :: String
t) acc :: String
acc = (String
acc,String
t)
findFragmentHelper "" acc :: String
acc = (String
acc,"")
findFragmentHelper _ _ = QueryException -> (String, String)
forall a e. Exception e => e -> a
throw QueryException
ParseFragmentException
    
expandFragment :: String -> ServerObject -> [Fragment] -> String
expandFragment :: String -> String -> [Fragment] -> String
expandFragment fnm :: String
fnm sobj :: String
sobj (h :: Fragment
h:t :: [Fragment]
t) = if (Fragment -> String
targetObject Fragment
h)String -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
sobjBool -> Bool -> Bool
&&String
fnmString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==("..."String -> String -> String
forall a. [a] -> [a] -> [a]
++(Fragment -> String
name Fragment
h)) then Fragment -> String
replacement Fragment
h else String -> String -> [Fragment] -> String
expandFragment String
fnm String
sobj [Fragment]
t
expandFragment _ _ [] = QueryException -> String
forall a e. Exception e => e -> a
throw QueryException
FindFragmentException

removeLeadingSpaces :: String -> String
removeLeadingSpaces :: String -> String
removeLeadingSpaces (' ':t :: String
t) = String -> String
removeLeadingSpaces String
t
removeLeadingSpaces str :: String
str = String
str
-- EFFECTS: return subselection and String remainder
getSubSelection :: String -> (String,String)
getSubSelection :: String -> (String, String)
getSubSelection str :: String
str = String -> String -> (String, String)
getSubSelectionHelper String
str ""
getSubSelectionHelper :: String -> String -> (String,String)
getSubSelectionHelper :: String -> String -> (String, String)
getSubSelectionHelper (')':t :: String
t) acc :: String
acc = (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++")", String
t)
getSubSelectionHelper (h :: Char
h:t :: String
t) acc :: String
acc = String -> String -> (String, String)
getSubSelectionHelper String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h])
getSubSelectionHelper "" acc :: String
acc = ("","")
-- split level at and without uneven brace.
splitLevel :: String -> String -> Int -> (String,String)
splitLevel :: String -> String -> Int -> (String, String)
splitLevel (h :: Char
h:t :: String
t) acc :: String
acc l :: Int
l
 | Int
lInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<0 = (String
acc,(Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t))
splitLevel ('{':t :: String
t) acc :: String
acc l :: Int
l = String -> String -> Int -> (String, String)
splitLevel String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"{") (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
+1)
splitLevel ('}':t :: String
t) acc :: String
acc l :: Int
l = String -> String -> Int -> (String, String)
splitLevel String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++"}") (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
-1)
splitLevel (h :: Char
h:t :: String
t) acc :: String
acc l :: Int
l = String -> String -> Int -> (String, String)
splitLevel String
t (String
accString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
h]) Int
l
splitLevel "" acc :: String
acc _ = (String
acc,[])
-- determine if directive result is to include or exclude
checkDirective :: String -> [(String,String,String)] -> (Bool, String)
checkDirective :: String -> [(String, String, String)] -> (Bool, String)
checkDirective qry :: String
qry vars :: [(String, String, String)]
vars = if (String -> Bool
isDirective String
qry)Bool -> Bool -> Bool
forall a. Eq a => a -> a -> Bool
==Bool
False then (Bool
True,String
qry) else (String, String, String)
-> [(String, String, String)] -> (Bool, String)
checkDirectiveHelper (String -> (String, String, String)
getDirective String
qry) [(String, String, String)]
vars
checkDirectiveHelper :: (String,String,String) -> [(String,String,String)] -> (Bool,String)
checkDirectiveHelper :: (String, String, String)
-> [(String, String, String)] -> (Bool, String)
checkDirectiveHelper (dir :: String
dir,(h :: Char
h:t :: String
t),tail :: String
tail) vars :: [(String, String, String)]
vars
    | String
directiveString -> String -> Bool
forall a. Eq a => a -> a -> Bool
=="include"Bool -> Bool -> Bool
&&String
valueString -> String -> Bool
forall a. Eq a => a -> a -> Bool
=="true"=(Bool
True,String
tail)
    | String
directiveString -> String -> Bool
forall a. Eq a => a -> a -> Bool
=="include"Bool -> Bool -> Bool
&&String
valueString -> String -> Bool
forall a. Eq a => a -> a -> Bool
=="false"=(Bool
False,String
tail)
    | String
directiveString -> String -> Bool
forall a. Eq a => a -> a -> Bool
=="skip"Bool -> Bool -> Bool
&&String
valueString -> String -> Bool
forall a. Eq a => a -> a -> Bool
=="true"=(Bool
False,String
tail)
    | String
directiveString -> String -> Bool
forall a. Eq a => a -> a -> Bool
=="skip"Bool -> Bool -> Bool
&&String
valueString -> String -> Bool
forall a. Eq a => a -> a -> Bool
=="false"=(Bool
True,String
tail)
    | Bool
otherwise = QueryException -> (Bool, String)
forall a e. Exception e => e -> a
throw QueryException
ReadDirectiveException
  where
    directive :: String
directive = String -> String
toLowercase String
dir
    value :: String
value = if Char
hChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
=='$' then String -> String
toLowercase (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ [(String, String, String)] -> String -> String
getVariableValue [(String, String, String)]
vars (Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t) else String -> String
toLowercase (Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t)
isDirective :: String -> Bool
isDirective :: String -> Bool
isDirective (' ':t :: String
t) = String -> Bool
isDirective String
t
isDirective ('@':_) = Bool
True
isDirective _ = Bool
False
getDirective :: String -> (String,String,String)
getDirective :: String -> (String, String, String)
getDirective (' ':t :: String
t) = String -> (String, String, String)
getDirective String
t
getDirective ('@':t :: String
t) = (String
dir,String
val,String
tail)
  where
    dir :: String
dir = String -> String
removeSideSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
=='@' then "" else String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x]) "" (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> Char -> String
getPrefix ('@'Char -> String -> String
forall a. a -> [a] -> [a]
:String
t) '('
    val :: String
val = String -> String
removeSideSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x]) "" (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> Char -> String
getPrefix String
t ')'
    tail :: String
tail = String -> Char -> String
getSuffix String
t ')'
getPrefix :: String -> Char -> String
getPrefix :: String -> Char -> String
getPrefix (h :: Char
h:t :: String
t) chr :: Char
chr = if Char
hChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==Char
chr then "" else Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String -> Char -> String
getPrefix String
t Char
chr
getPrefix "" _ = ""
getSuffix :: String -> Char -> String
getSuffix :: String -> Char -> String
getSuffix (h :: Char
h:t :: String
t) chr :: Char
chr = if Char
hChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==Char
chr then String
t else String -> Char -> String
getSuffix String
t Char
chr
getSuffix "" _ = ""
toLowercase :: String -> String
toLowercase :: String -> String
toLowercase str :: String
str = [Char -> Char
toLower Char
c | Char
c <- String
str]
getVariableValue :: [(String,String,String)] -> String -> String
getVariableValue :: [(String, String, String)] -> String -> String
getVariableValue ((name :: String
name,"Boolean",val :: String
val):t :: [(String, String, String)]
t) var :: String
var
 | (String
nameString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
var) = String
val
getVariableValue ((name :: String
name,typ :: String
typ,val :: String
val):t :: [(String, String, String)]
t) var :: String
var = if String
nameString -> String -> Bool
forall a. Eq a => a -> a -> Bool
==String
var then QueryException -> String
forall a e. Exception e => e -> a
throw QueryException
MismatchedVariableTypeException else [(String, String, String)] -> String -> String
getVariableValue [(String, String, String)]
t String
var
getVariableValue [] _ = QueryException -> String
forall a e. Exception e => e -> a
throw QueryException
InvalidVariableNameException
-- pull level and leave out closing brace.
extractLevel :: String -> String
extractLevel :: String -> String
extractLevel "" = ""
extractLevel str :: String
str = String -> Int -> String
extractLevelHelper String
str 0
extractLevelHelper :: String -> Int -> String
extractLevelHelper :: String -> Int -> String
extractLevelHelper ('{':t :: String
t) l :: Int
l = '{'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> Int -> String
extractLevelHelper String
t (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
+1)
extractLevelHelper ('}':t :: String
t) 0 = ""
extractLevelHelper ('}':t :: String
t) l :: Int
l = '}'Char -> String -> String
forall a. a -> [a] -> [a]
:String -> Int -> String
extractLevelHelper String
t (Int
lInt -> Int -> Int
forall a. Num a => a -> a -> a
-1)
extractLevelHelper (h :: Char
h:t :: String
t) l :: Int
l = Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String -> Int -> String
extractLevelHelper String
t Int
l
extractLevelHelper "" _ = ""
removeSpaces :: String -> String
removeSpaces :: String -> String
removeSpaces str :: String
str = [Char
x | Char
x <- String
str, Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=' ']
createScalarType :: String -> ScalarType
createScalarType :: String -> ScalarType
createScalarType (h :: Char
h:t :: String
t) = Maybe String
-> String -> Maybe String -> Maybe String -> ScalarType
ScalarType (String -> Maybe String
parseAlias (Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t)) (String -> String
parseName (Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t)) (String -> Maybe String
parseTransformation (Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t)) (String -> Maybe String
parseArgument (Char
hChar -> String -> String
forall a. a -> [a] -> [a]
:String
t))
createScalarType "" = QueryException -> ScalarType
forall a e. Exception e => e -> a
throw QueryException
InvalidScalarException
parseTransformation :: String -> Transformation
parseTransformation :: String -> Maybe String
parseTransformation "" = Maybe String
forall a. Maybe a
Nothing :: Transformation
parseTransformation str :: String
str
    | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem '(' String
str)Bool -> Bool -> Bool
&&(Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str) = (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String -> String
removeSideSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
=='(' then "" else String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x]) "" String
str) :: Transformation
    | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem '(' String
str) = QueryException -> Maybe String
forall a e. Exception e => e -> a
throw QueryException
TransformationSyntaxException
    | Bool
otherwise = Maybe String
forall a. Maybe a
Nothing :: Transformation
parseArgument :: String -> Argument
parseArgument :: String -> Maybe String
parseArgument "" = Maybe String
forall a. Maybe a
Nothing :: Argument
parseArgument str :: String
str
    | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ')' String
str)Bool -> Bool -> Bool
&&(Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ':' String
str) = (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String -> String
removeSideSpaces (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==')' then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==':' then "" else String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x]) "" String
str) :: Argument
    | (Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem ')' String
str) = QueryException -> Maybe String
forall a e. Exception e => e -> a
throw QueryException
TransformationSyntaxException
    | Bool
otherwise = Maybe String
forall a. Maybe a
Nothing :: Argument
removeSideSpaces :: String -> String
removeSideSpaces :: String -> String
removeSideSpaces str :: String
str = (String -> Char -> String) -> String -> String -> String
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (\y :: String
y x :: Char
x -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==' 'Bool -> Bool -> Bool
&&(String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
y)Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==0 then "" else String
yString -> String -> String
forall a. [a] -> [a] -> [a]
++[Char
x]) "" (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ (Char -> String -> String) -> String -> String -> String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\x :: Char
x y :: String
y -> if Char
xChar -> Char -> Bool
forall a. Eq a => a -> a -> Bool
==' 'Bool -> Bool -> Bool
&&(String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
y)Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==0 then "" else Char
xChar -> String -> String
forall a. a -> [a] -> [a]
:String
y) "" String
str

{-----Step 4. CROSS-CHECKING-----}
-- done by ServerObjectValidator.hs

{-----Step 5. MAKE QUERY-----}
-- done by SQLQueryComposer.hs for sql queries

{-----Step 6. PROCESS RESULTS-----}
-- done by PersistentDataProcessor.hs