{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}

-- | Utility functions for 'Language.Haskell.TH.PprLib.Doc' manipulation
module OpenAPI.Generate.Doc
  ( typeAliasModule,
    emptyDoc,
    appendDoc,
    generateHaddockComment,
    escapeText,
    breakOnTokens,
    reformatRecord,
    reformatADT,
    sideComments,
    zipCodeAndComments,
    sideBySide,
    addOperationsModuleHeader,
    addSecuritySchemesModuleHeader,
    addConfigurationModuleHeader,
    createModuleHeaderWithReexports,
    addModelModuleHeader,
  )
where

import qualified Control.Applicative as Applicative
import Data.Text (Text)
import qualified Data.Text as T
import Language.Haskell.TH.PprLib hiding ((<>))

-- | The name of the module which contains all type aliases which would be in their own module otherwise
typeAliasModule :: String
typeAliasModule :: String
typeAliasModule = String
"TypeAlias"

-- | Empty document inside an 'Applicative' (typically 'Language.Haskell.TH.Q')
emptyDoc :: (Applicative f) => f Doc
emptyDoc :: forall (f :: * -> *). Applicative f => f (PprM Doc)
emptyDoc = PprM Doc -> f (PprM Doc)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PprM Doc
empty

haddockIntro :: Doc
haddockIntro :: PprM Doc
haddockIntro = String -> PprM Doc
text String
"-- |"

haddockLine :: Doc
haddockLine :: PprM Doc
haddockLine = String -> PprM Doc
text String
"--"

textToDoc :: Text -> Doc
textToDoc :: Text -> PprM Doc
textToDoc = String -> PprM Doc
text (String -> PprM Doc) -> (Text -> String) -> Text -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack

line :: String -> Doc -> Doc
line :: String -> PprM Doc -> PprM Doc
line = PprM Doc -> PprM Doc -> PprM Doc
($$) (PprM Doc -> PprM Doc -> PprM Doc)
-> (String -> PprM Doc) -> String -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc
text

emptyLine :: Doc -> Doc
emptyLine :: PprM Doc -> PprM Doc
emptyLine = String -> PprM Doc -> PprM Doc
line String
""

languageExtension :: String -> Doc -> Doc
languageExtension :: String -> PprM Doc -> PprM Doc
languageExtension = String -> PprM Doc -> PprM Doc
line (String -> PprM Doc -> PprM Doc)
-> (String -> String) -> String -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"{-# LANGUAGE " String -> String -> String
forall a. Semigroup a => a -> a -> a
<>) (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" #-}")

importQualified :: String -> Doc -> Doc
importQualified :: String -> PprM Doc -> PprM Doc
importQualified = String -> PprM Doc -> PprM Doc
importUnqualified (String -> PprM Doc -> PprM Doc)
-> (String -> String) -> String -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"qualified " String -> String -> String
forall a. Semigroup a => a -> a -> a
<>)

importUnqualified :: String -> Doc -> Doc
importUnqualified :: String -> PprM Doc -> PprM Doc
importUnqualified = String -> PprM Doc -> PprM Doc
line (String -> PprM Doc -> PprM Doc)
-> (String -> String) -> String -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"import " String -> String -> String
forall a. Semigroup a => a -> a -> a
<>)

moduleDescription :: String -> Doc -> Doc
moduleDescription :: String -> PprM Doc -> PprM Doc
moduleDescription = String -> PprM Doc -> PprM Doc
line (String -> PprM Doc -> PprM Doc)
-> (String -> String) -> String -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"-- | " String -> String -> String
forall a. Semigroup a => a -> a -> a
<>)

moduleDeclaration :: String -> String -> Doc -> Doc
moduleDeclaration :: String -> String -> PprM Doc -> PprM Doc
moduleDeclaration String
modulePrefix String
name = String -> PprM Doc -> PprM Doc
line (String
"module " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
modulePrefix String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"." String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
name String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" where")

generatorNote :: Doc -> Doc
generatorNote :: PprM Doc -> PprM Doc
generatorNote = String -> PprM Doc -> PprM Doc
line String
"-- CHANGE WITH CAUTION: This is a generated code file generated by https://github.com/Haskell-OpenAPI-Code-Generator/Haskell-OpenAPI-Client-Code-Generator." (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine

-- | Append a 'Doc' to another inside an 'Applicative' (typically 'Language.Haskell.TH.Q')
appendDoc :: (Applicative f) => f Doc -> f Doc -> f Doc
appendDoc :: forall (f :: * -> *).
Applicative f =>
f (PprM Doc) -> f (PprM Doc) -> f (PprM Doc)
appendDoc = (PprM Doc -> PprM Doc -> PprM Doc)
-> f (PprM Doc) -> f (PprM Doc) -> f (PprM Doc)
forall a b c. (a -> b -> c) -> f a -> f b -> f c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
Applicative.liftA2 PprM Doc -> PprM Doc -> PprM Doc
($$)

-- | Generate a Haddock comment with multiple lines
generateHaddockComment :: [Text] -> Doc
generateHaddockComment :: [Text] -> PprM Doc
generateHaddockComment =
  [Text] -> PprM Doc
generateHaddockCommentWithoutNewlines
    ([Text] -> PprM Doc) -> ([Text] -> [Text]) -> [Text] -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ( [Text] -> (Text -> [Text]) -> [Text]
forall a b. [a] -> (a -> [b]) -> [b]
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
          ( \case
              [] -> [Text
""]
              [Text]
x -> [Text]
x
          )
            ([Text] -> [Text]) -> (Text -> [Text]) -> Text -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
T.lines
      )

generateHaddockCommentWithoutNewlines :: [Text] -> Doc
generateHaddockCommentWithoutNewlines :: [Text] -> PprM Doc
generateHaddockCommentWithoutNewlines [] = PprM Doc
empty
generateHaddockCommentWithoutNewlines [Text
x] = PprM Doc
haddockIntro PprM Doc -> PprM Doc -> PprM Doc
<+> Text -> PprM Doc
textToDoc Text
x
generateHaddockCommentWithoutNewlines [Text]
xs =
  [Text] -> PprM Doc
generateHaddockCommentWithoutNewlines ([Text] -> [Text]
forall a. HasCallStack => [a] -> [a]
init [Text]
xs)
    PprM Doc -> PprM Doc -> PprM Doc
$$ PprM Doc
haddockLine
      PprM Doc -> PprM Doc -> PprM Doc
<+> Text -> PprM Doc
textToDoc ([Text] -> Text
forall a. HasCallStack => [a] -> a
last [Text]
xs)

-- | Escape text for use in Haddock comment
escapeText :: Text -> Text
escapeText :: Text -> Text
escapeText =
  HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"'" Text
"\\'"
    (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"\"" Text
"\\\""
    (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"`" Text
"\\`"
    (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"@" Text
"\\@"
    (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"$" Text
"\\$"
    (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"#" Text
"\\#"
    (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"<" Text
"\\<"
    (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"/" Text
"\\/"
    (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"\\" Text
"\\\\"

-- | Add line breaks to a 'Doc' at all occurrences of the passed tokens (removes all other line breaks).
breakOnTokens :: [Text] -> Doc -> Doc
breakOnTokens :: [Text] -> PprM Doc -> PprM Doc
breakOnTokens = (Text -> Text) -> [Text] -> PprM Doc -> PprM Doc
breakOnTokensWithReplacement (Text
"\n  " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>)

-- | Add line breaks to a 'Doc' at all occurrences of the passed tokens (removes all other line breaks).
-- The replacement function is used to generate the text replacing the tokens.
breakOnTokensWithReplacement :: (Text -> Text) -> [Text] -> Doc -> Doc
breakOnTokensWithReplacement :: (Text -> Text) -> [Text] -> PprM Doc -> PprM Doc
breakOnTokensWithReplacement Text -> Text
replaceFn [Text]
tokens =
  let addLineBreaks :: Text -> Text
addLineBreaks = (Text -> (Text -> Text) -> Text -> Text)
-> (Text -> Text) -> [Text] -> Text -> Text
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\Text
token Text -> Text
f -> HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
token (Text -> Text
replaceFn Text
token) (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
f) Text -> Text
forall a. a -> a
id [Text]
tokens
   in String -> PprM Doc
text
        (String -> PprM Doc)
-> (PprM Doc -> String) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
        (Text -> String) -> (PprM Doc -> Text) -> PprM Doc -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Text] -> Text
T.unlines
        ([Text] -> Text) -> (PprM Doc -> [Text]) -> PprM Doc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> Text) -> [Text] -> [Text]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Text -> Text
T.stripEnd
        ([Text] -> [Text]) -> (PprM Doc -> [Text]) -> PprM Doc -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> [Text]
T.lines
        (Text -> [Text]) -> (PprM Doc -> Text) -> PprM Doc -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
addLineBreaks
        (Text -> Text) -> (PprM Doc -> Text) -> PprM Doc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"\n" Text
""
        (Text -> Text) -> (PprM Doc -> Text) -> PprM Doc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text
removeDuplicateSpaces
        (Text -> Text) -> (PprM Doc -> Text) -> PprM Doc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack
        (String -> Text) -> (PprM Doc -> String) -> PprM Doc -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> String
forall a. Show a => a -> String
show

reformatRecord :: Doc -> Doc
reformatRecord :: PprM Doc -> PprM Doc
reformatRecord =
  (Text -> Text) -> [Text] -> PprM Doc -> PprM Doc
breakOnTokensWithReplacement
    ( \case
        Text
"{" -> Text
"{\n  "
        Text
token -> Text
"\n  " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
token
    )
    [Text
",", Text
"{", Text
"}"]

reformatADT :: Doc -> Doc
reformatADT :: PprM Doc -> PprM Doc
reformatADT =
  (Text -> Text) -> [Text] -> PprM Doc -> PprM Doc
breakOnTokensWithReplacement
    ( \case
        Text
"=" -> Text
"=\n  "
        Text
token -> Text
"\n  " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
token
    )
    [Text
"=", Text
"deriving", Text
"|"]

removeDuplicateSpaces :: Text -> Text
removeDuplicateSpaces :: Text -> Text
removeDuplicateSpaces Text
t =
  let t' :: Text
t' = HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"  " Text
" " Text
t
   in if Text
t Text -> Text -> Bool
forall a. Eq a => a -> a -> Bool
== Text
t' then Text
t' else Text -> Text
removeDuplicateSpaces Text
t'

-- | Convert a list of lines to side comments
sideComments :: [Text] -> Doc
sideComments :: [Text] -> PprM Doc
sideComments = [PprM Doc] -> PprM Doc
vcat ([PprM Doc] -> PprM Doc)
-> ([Text] -> [PprM Doc]) -> [Text] -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text -> PprM Doc) -> [Text] -> [PprM Doc]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> PprM Doc
text (String -> PprM Doc) -> (Text -> String) -> Text -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack (Text -> String) -> (Text -> Text) -> Text -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> Text -> Text
Text -> Text -> Text -> Text
T.replace Text
"\n" Text
" " (Text -> Text) -> (Text -> Text) -> Text -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text
"-- ^ " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<>))

-- | Intertwine code lines with comment lines
--
-- The code lines should have one more line (the first line is not commented)
zipCodeAndComments :: [Text] -> [Text] -> Doc
zipCodeAndComments :: [Text] -> [Text] -> PprM Doc
zipCodeAndComments [] [Text]
_ = PprM Doc
empty
zipCodeAndComments [Text
x] [Text]
_ = Text -> PprM Doc
textToDoc Text
x
zipCodeAndComments (Text
x : [Text]
xs) [] = Text -> PprM Doc
textToDoc Text
x PprM Doc -> PprM Doc -> PprM Doc
$$ [Text] -> [Text] -> PprM Doc
zipCodeAndComments [Text]
xs []
zipCodeAndComments (Text
x : [Text]
xs) (Text
y : [Text]
ys) = Text -> PprM Doc
textToDoc Text
x PprM Doc -> PprM Doc -> PprM Doc
$$ Int -> PprM Doc -> PprM Doc
nest Int
2 ([Text] -> PprM Doc
generateHaddockComment [Text
y]) PprM Doc -> PprM Doc -> PprM Doc
$$ [Text] -> [Text] -> PprM Doc
zipCodeAndComments [Text]
xs [Text]
ys

-- | Place two documents side-by-side, aligned at the top line
--
-- If one of the documents is longer than the other, the shorter one is extended with empty lines.
--
-- Example usage:
--
-- >>> show $ sideBySide (text "a") (text "b" $$ text "c")
-- a b
-- c
sideBySide :: Doc -> Doc -> Doc
sideBySide :: PprM Doc -> PprM Doc -> PprM Doc
sideBySide PprM Doc
leftDoc PprM Doc
rightDoc =
  let splitDoc :: PprM Doc -> [PprM Doc]
splitDoc = (String -> PprM Doc) -> [String] -> [PprM Doc]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\String
l -> if String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
l then PprM Doc
empty else String -> PprM Doc
text String
l) ([String] -> [PprM Doc])
-> (PprM Doc -> [String]) -> PprM Doc -> [PprM Doc]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String]
lines (String -> [String])
-> (PprM Doc -> String) -> PprM Doc -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> String
forall a. Show a => a -> String
show
      ([PprM Doc]
leftDoc', [PprM Doc]
rightDoc') = case (PprM Doc -> [PprM Doc]
splitDoc PprM Doc
leftDoc, PprM Doc -> [PprM Doc]
splitDoc PprM Doc
rightDoc) of
        ([PprM Doc]
l, [PprM Doc]
r) | [PprM Doc] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PprM Doc]
l Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< [PprM Doc] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [PprM Doc]
r -> ([PprM Doc]
l [PprM Doc] -> [PprM Doc] -> [PprM Doc]
forall a. Semigroup a => a -> a -> a
<> PprM Doc -> [PprM Doc]
forall a. a -> [a]
repeat PprM Doc
empty, [PprM Doc]
r)
        ([PprM Doc]
l, [PprM Doc]
r) -> ([PprM Doc]
l, [PprM Doc]
r [PprM Doc] -> [PprM Doc] -> [PprM Doc]
forall a. Semigroup a => a -> a -> a
<> PprM Doc -> [PprM Doc]
forall a. a -> [a]
repeat PprM Doc
empty)
   in (PprM Doc -> PprM Doc -> PprM Doc)
-> PprM Doc -> [PprM Doc] -> PprM Doc
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl PprM Doc -> PprM Doc -> PprM Doc
($$) PprM Doc
empty ([PprM Doc] -> PprM Doc) -> [PprM Doc] -> PprM Doc
forall a b. (a -> b) -> a -> b
$
        (PprM Doc -> PprM Doc -> PprM Doc)
-> [PprM Doc] -> [PprM Doc] -> [PprM Doc]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\PprM Doc
l PprM Doc
r -> if String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PprM Doc -> String
forall a. Show a => a -> String
show PprM Doc
l) Bool -> Bool -> Bool
&& String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null (PprM Doc -> String
forall a. Show a => a -> String
show PprM Doc
r) then String -> PprM Doc
text String
"" else PprM Doc
l PprM Doc -> PprM Doc -> PprM Doc
<+> PprM Doc
r) [PprM Doc]
leftDoc' [PprM Doc]
rightDoc'

-- | Add the module header to a module of an operation
addOperationsModuleHeader :: String -> String -> String -> Doc -> Doc
addOperationsModuleHeader :: String -> String -> String -> PprM Doc -> PprM Doc
addOperationsModuleHeader String
mainModuleName String
moduleName String
operationId =
  PprM Doc -> PprM Doc
generatorNote
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
languageExtension String
"OverloadedStrings"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
languageExtension String
"ExplicitForAll"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
languageExtension String
"MultiWayIf"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
moduleDescription (String
"Contains the different functions to run the operation " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
operationId)
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> PprM Doc -> PprM Doc
moduleDeclaration (String
mainModuleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".Operations") String
moduleName
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Prelude as GHC.Integer.Type"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Prelude as GHC.Maybe"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Control.Monad.Fail"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Control.Monad.Trans.Reader"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Encoding.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Types"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Types.FromJSON"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Types.ToJSON"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Types.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.ByteString"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.ByteString as Data.ByteString.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.ByteString as Data.ByteString.Internal.Type"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Either"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Foldable"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Functor"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Maybe"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Scientific"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Text"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Text as Data.Text.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Time.Calendar as Data.Time.Calendar.Days"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Time.LocalTime as Data.Time.LocalTime.Internal.ZonedTime"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Vector"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Base"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Classes"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Int"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Show"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Types"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Client"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Client as Network.HTTP.Client.Request"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Client as Network.HTTP.Client.Types"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Simple"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Types"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Types as Network.HTTP.Types.Status"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Types as Network.HTTP.Types.URI"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified (String
mainModuleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".Common")
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importUnqualified (String
mainModuleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".Types")
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine

-- | Add the module header to a module of a model
addModelModuleHeader :: String -> String -> [String] -> String -> Doc -> Doc
addModelModuleHeader :: String -> String -> [String] -> String -> PprM Doc -> PprM Doc
addModelModuleHeader String
mainModuleName String
moduleName [String]
modelModulesToImport String
description =
  PprM Doc -> PprM Doc
generatorNote
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
languageExtension String
"OverloadedStrings"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
languageExtension String
"MultiWayIf"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
moduleDescription String
description
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> PprM Doc -> PprM Doc
moduleDeclaration String
mainModuleName String
moduleName
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Prelude as GHC.Integer.Type"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Prelude as GHC.Maybe"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Control.Monad.Fail"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Encoding.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Types"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Types.FromJSON"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Types.ToJSON"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Aeson as Data.Aeson.Types.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.ByteString"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.ByteString as Data.ByteString.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Foldable"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Functor"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Maybe"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Scientific"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Text"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Text as Data.Text.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Time.Calendar as Data.Time.Calendar.Days"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Time.LocalTime as Data.Time.LocalTime.Internal.ZonedTime"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Base"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Classes"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Int"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Show"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Types"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified (String
mainModuleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".Common")
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if String
moduleName String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
typeAliasModule then PprM Doc -> PprM Doc
forall a. a -> a
id else String -> PprM Doc -> PprM Doc
importUnqualified (String
mainModuleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"." String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
typeAliasModule))
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([PprM Doc] -> PprM Doc
vcat ((String -> PprM Doc) -> [String] -> [PprM Doc]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> PprM Doc
text (String -> PprM Doc) -> (String -> String) -> String -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"import {-# SOURCE #-} " String -> String -> String
forall a. Semigroup a => a -> a -> a
<>) (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((String
mainModuleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".") String -> String -> String
forall a. Semigroup a => a -> a -> a
<>)) [String]
modelModulesToImport) PprM Doc -> PprM Doc -> PprM Doc
$$)
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine

-- | Add the module header to the security scheme module
addSecuritySchemesModuleHeader :: String -> Doc -> Doc
addSecuritySchemesModuleHeader :: String -> PprM Doc -> PprM Doc
addSecuritySchemesModuleHeader String
moduleName =
  PprM Doc -> PprM Doc
generatorNote
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
languageExtension String
"OverloadedStrings"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
moduleDescription String
"Contains all supported security schemes defined in the specification"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> PprM Doc -> PprM Doc
moduleDeclaration String
moduleName String
"SecuritySchemes"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Text as Data.Text.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Base"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Classes"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Show"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Client as Network.HTTP.Client.Request"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Network.HTTP.Simple"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified (String
moduleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".Common")
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine

-- | Add the module header to the configuration module
addConfigurationModuleHeader :: String -> Doc -> Doc
addConfigurationModuleHeader :: String -> PprM Doc -> PprM Doc
addConfigurationModuleHeader String
moduleName =
  PprM Doc -> PprM Doc
generatorNote
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
languageExtension String
"OverloadedStrings"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
moduleDescription String
"Contains the default configuration"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> PprM Doc -> PprM Doc
moduleDeclaration String
moduleName String
"Configuration"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Text"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"Data.Text as Data.Text.Internal"
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified String
"GHC.Types "
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> PprM Doc -> PprM Doc
importQualified (String
moduleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
".Common")
    (PprM Doc -> PprM Doc)
-> (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PprM Doc -> PprM Doc
emptyLine

-- | Create a 'Doc' containing a module which imports other modules and re-exports them
createModuleHeaderWithReexports :: String -> [String] -> String -> Doc
createModuleHeaderWithReexports :: String -> [String] -> String -> PprM Doc
createModuleHeaderWithReexports String
moduleName [String]
modulesToExport String
description =
  let exports :: PprM Doc
exports = [PprM Doc] -> PprM Doc
vcat ([PprM Doc] -> PprM Doc) -> [PprM Doc] -> PprM Doc
forall a b. (a -> b) -> a -> b
$ (String -> PprM Doc) -> [String] -> [PprM Doc]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> PprM Doc
text (String -> PprM Doc) -> (String -> String) -> String -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"module " String -> String -> String
forall a. Semigroup a => a -> a -> a
<>) (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
",")) [String]
modulesToExport
      imports :: PprM Doc
imports = [PprM Doc] -> PprM Doc
vcat ([PprM Doc] -> PprM Doc) -> [PprM Doc] -> PprM Doc
forall a b. (a -> b) -> a -> b
$ (String -> PprM Doc) -> [String] -> [PprM Doc]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (String -> PprM Doc
text (String -> PprM Doc) -> (String -> String) -> String -> PprM Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"import " String -> String -> String
forall a. Semigroup a => a -> a -> a
<>)) [String]
modulesToExport
   in PprM Doc -> PprM Doc
generatorNote (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall a b. (a -> b) -> a -> b
$
        String -> PprM Doc -> PprM Doc
moduleDescription String
description (PprM Doc -> PprM Doc) -> PprM Doc -> PprM Doc
forall a b. (a -> b) -> a -> b
$
          String -> PprM Doc
text (String
"module " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
moduleName String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" (")
            PprM Doc -> PprM Doc -> PprM Doc
$$ Int -> PprM Doc -> PprM Doc
nest
              Int
2
              ( PprM Doc
exports
                  PprM Doc -> PprM Doc -> PprM Doc
$$ String -> PprM Doc
text String
") where"
              )
            PprM Doc -> PprM Doc -> PprM Doc
$$ String -> PprM Doc
text String
""
            PprM Doc -> PprM Doc -> PprM Doc
$$ PprM Doc
imports