Skip to content

Commit 71dcea9

Browse files
author
Dan Fithian
committed
Top level module name
1 parent 2bec5cc commit 71dcea9

File tree

3 files changed

+78
-21
lines changed

3 files changed

+78
-21
lines changed

openapi3-code-generator/src/OpenAPI/Generate/IO.hs

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -152,16 +152,18 @@ permitProceed settings = do
152152
getHsBootFiles :: OAO.Settings -> [([String], String)] -> FilesWithContent
153153
getHsBootFiles settings modelModules =
154154
let outputDirectory = T.unpack $ OAO.settingOutputDir settings
155-
moduleName = T.unpack $ OAO.settingModuleName settings
155+
moduleName = OAO.settingModuleName settings
156+
moduleNameStr = OAO.getModuleName moduleName
157+
modulePathInfo = OAO.mkModulePathInfo moduleName
156158
in BF.bimap
157-
((outputDirectory </>) . (srcDirectory </>) . (moduleName </>) . (<> ".hs-boot") . foldr1 (</>))
159+
((\suffix -> outputDirectory </> srcDirectory </> OAO.getModuleInfoPath modulePathInfo (Just suffix) ".hs-boot") . foldr1 (</>))
158160
( T.unpack
159161
. T.unlines
160162
. ( \xs -> case xs of
161163
x : xs' ->
162164
x
163165
: "import qualified Data.Aeson"
164-
: "import qualified " <> T.pack moduleName <> ".Common"
166+
: "import qualified " <> T.pack moduleNameStr <> ".Common"
165167
: xs'
166168
_ -> xs
167169
)
@@ -202,63 +204,66 @@ data OutputFiles = OutputFiles
202204
generateFilesToCreate :: OAT.OpenApiSpecification -> OAO.Settings -> IO OutputFiles
203205
generateFilesToCreate spec settings = do
204206
let outputDirectory = T.unpack $ OAO.settingOutputDir settings
205-
moduleName = T.unpack $ OAO.settingModuleName settings
207+
moduleName = OAO.settingModuleName settings
208+
modulePathInfo = OAO.mkModulePathInfo moduleName
209+
moduleNameStr = OAO.getModuleName moduleName
206210
packageName = T.unpack $ OAO.settingPackageName settings
207211
env = OAM.createEnvironment settings $ Ref.buildReferenceMap spec
208212
logMessages = mapM_ (putStrLn . T.unpack) . OAL.filterAndTransformLogs (OAO.settingLogLevel settings)
209-
showAndReplace = replaceOpenAPI moduleName . show
210-
((operationsQ, operationDependencies), logs) = OAM.runGenerator env $ defineOperations moduleName spec
213+
showAndReplace = replaceOpenAPI moduleNameStr . show
214+
((operationsQ, operationDependencies), logs) = OAM.runGenerator env $ defineOperations moduleNameStr spec
211215
logMessages logs
212216
operationModules <- runQ operationsQ
213-
configurationInfo <- runQ $ defineConfigurationInformation moduleName spec
214-
let (modelsQ, logsModels) = OAM.runGenerator env $ defineModels moduleName spec operationDependencies
217+
configurationInfo <- runQ $ defineConfigurationInformation moduleNameStr spec
218+
let (modelsQ, logsModels) = OAM.runGenerator env $ defineModels moduleNameStr spec operationDependencies
215219
logMessages logsModels
216220
modelModules <- fmap (BF.second showAndReplace) <$> runQ modelsQ
217-
let (securitySchemesQ, logs') = OAM.runGenerator env $ defineSecuritySchemes moduleName spec
221+
let (securitySchemesQ, logs') = OAM.runGenerator env $ defineSecuritySchemes moduleNameStr spec
218222
logMessages logs'
219223
securitySchemes' <- runQ securitySchemesQ
220224
let modules =
221225
fmap (BF.bimap ("Operations" :) showAndReplace) operationModules
222226
<> modelModules
223227
<> [ (["Configuration"], showAndReplace configurationInfo),
224228
(["SecuritySchemes"], showAndReplace securitySchemes'),
225-
(["Common"], replaceOpenAPI moduleName $ replaceVersionNumber $(embedFile "src/OpenAPI/Common.hs"))
229+
(["Common"], replaceOpenAPI moduleNameStr $ replaceVersionNumber $(embedFile "src/OpenAPI/Common.hs"))
226230
]
227231
modulesToExport =
228232
fmap
229-
( (moduleName <>)
233+
( (moduleNameStr <>)
230234
. ("." <>)
231235
. joinWithPoint
232236
. fst
233237
)
234238
modules
235-
mainFile = outputDirectory </> srcDirectory </> (moduleName ++ ".hs")
236-
mainModuleContent = show $ Doc.createModuleHeaderWithReexports moduleName modulesToExport "The main module which exports all functionality."
239+
mainFile = outputDirectory </> srcDirectory </> OAO.getModuleInfoPath modulePathInfo Nothing ".hs"
240+
mainModuleContent = show $ Doc.createModuleHeaderWithReexports moduleNameStr modulesToExport "The main module which exports all functionality."
237241
hsBootFiles = getHsBootFiles settings modelModules
238242
pure $
239243
OutputFiles
240244
( BF.second (unlines . lines)
241245
<$> (mainFile, mainModuleContent)
242-
: (BF.first ((outputDirectory </>) . (srcDirectory </>) . (moduleName </>) . (<> ".hs") . foldr1 (</>)) <$> modules)
246+
: (BF.first ((\suffix -> outputDirectory </> srcDirectory </> OAO.getModuleInfoPath modulePathInfo (Just suffix) ".hs") . foldr1 (</>)) <$> modules)
243247
<> hsBootFiles
244248
)
245-
(BF.first (outputDirectory </>) <$> cabalProjectFiles packageName moduleName modulesToExport)
249+
(BF.first (outputDirectory </>) <$> cabalProjectFiles packageName moduleNameStr modulesToExport)
246250
(BF.first (outputDirectory </>) <$> stackProjectFiles)
247251
(BF.first (outputDirectory </>) <$> nixProjectFiles packageName)
248252

249253
writeFiles :: OAO.Settings -> OutputFiles -> IO ()
250254
writeFiles settings OutputFiles {..} = do
251255
let outputDirectory = T.unpack $ OAO.settingOutputDir settings
252-
moduleName = T.unpack $ OAO.settingModuleName settings
256+
modulePathInfo = OAO.mkModulePathInfo $ OAO.settingModuleName settings
257+
moduleDir = OAO.getModuleInfoDir modulePathInfo
253258
incremental = OAO.settingIncremental settings
254259
write = mapM_ $ if incremental then writeFileIncremental else writeFileWithLog
255260
putStrLn "Remove old output directory"
256261
unless incremental $
257262
void $
258263
tryIOError (removeDirectoryRecursive outputDirectory)
259264
putStrLn "Output directory removed, create missing directories"
260-
createDirectoryIfMissing True (outputDirectory </> srcDirectory </> moduleName </> "Operations")
261-
createDirectoryIfMissing True (outputDirectory </> srcDirectory </> moduleName </> "Types")
265+
createDirectoryIfMissing True (outputDirectory </> srcDirectory </> moduleDir </> "Operations")
266+
createDirectoryIfMissing True (outputDirectory </> srcDirectory </> moduleDir </> "Types")
262267
putStrLn "Directories created"
263268
write outputFilesModuleFiles
264269
write outputFilesCabalFiles

openapi3-code-generator/src/OpenAPI/Generate/OptParse.hs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
module OpenAPI.Generate.OptParse
88
( Settings (..),
99
getSettings,
10+
module OAT,
1011
)
1112
where
1213

@@ -19,7 +20,7 @@ import qualified Data.Text as T
1920
import qualified OpenAPI.Generate.Log as OAL
2021
import OpenAPI.Generate.OptParse.Configuration
2122
import OpenAPI.Generate.OptParse.Flags
22-
import OpenAPI.Generate.OptParse.Types
23+
import OpenAPI.Generate.OptParse.Types as OAT
2324
import Options.Applicative
2425
import Options.Applicative.Help (string)
2526
import Path
@@ -42,7 +43,7 @@ data Settings = Settings
4243
-- | Name of the stack project
4344
settingPackageName :: !Text,
4445
-- | Name of the module
45-
settingModuleName :: !Text,
46+
settingModuleName :: !ModuleName,
4647
-- | The minimum log level to output
4748
settingLogLevel :: !OAL.LogSeverity,
4849
-- | Overwrite output directory without question
@@ -127,7 +128,7 @@ combineToSettings Flags {..} mConf configurationFilePath = do
127128
let settingOpenApiSpecification = fromMaybe "openapi-specification.yml" $ flagOpenApiSpecification <|> mConfigOpenApiSpecification
128129
settingOutputDir = fromMaybe "out" $ flagOutputDir <|> mConfigOutputDir
129130
settingPackageName = fromMaybe "openapi" $ flagPackageName <|> mc configPackageName
130-
settingModuleName = fromMaybe "OpenAPI" $ flagModuleName <|> mc configModuleName
131+
settingModuleName = mkModuleName . T.unpack $ fromMaybe "OpenAPI" (flagModuleName <|> mc configModuleName)
131132
settingLogLevel = fromMaybe OAL.InfoSeverity $ flagLogLevel <|> mc configLogLevel
132133
settingForce = fromMaybe False $ flagForce <|> mc configForce
133134
settingIncremental = fromMaybe False $ flagIncremental <|> mc configIncremental

openapi3-code-generator/src/OpenAPI/Generate/OptParse/Types.hs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,60 @@
1+
{-# LANGUAGE OverloadedStrings #-}
2+
13
module OpenAPI.Generate.OptParse.Types
24
( FixedValueStrategy (..),
5+
ModuleName,
6+
ModulePathInfo,
7+
mkModuleName,
8+
getModuleName,
9+
mkModulePathInfo,
10+
getModuleInfoPath,
11+
getModuleInfoDir,
312
)
413
where
514

615
import Autodocodec
16+
import qualified Data.Maybe as Maybe
17+
import qualified Data.Text as T
18+
import System.FilePath ((</>))
19+
20+
newtype ModuleName = ModuleName String
21+
deriving (Show, Eq)
22+
23+
newtype ModulePathInfo = ModulePathInfo (Maybe FilePath, FilePath)
24+
25+
mkModuleName :: String -> ModuleName
26+
mkModuleName = ModuleName
27+
28+
getModuleName :: ModuleName -> String
29+
getModuleName (ModuleName moduleNameStr) = moduleNameStr
30+
31+
mkModulePathInfo :: ModuleName -> ModulePathInfo
32+
mkModulePathInfo (ModuleName moduleNameStr) =
33+
let (dirMay, fileNoExtensionMay) =
34+
foldl
35+
( \acc next ->
36+
let dMay = case acc of
37+
(Nothing, Just prev) -> Just prev
38+
(Just dir, Just prev) -> Just $ dir </> prev
39+
(dMay', Nothing) -> dMay'
40+
in (dMay, Just $ T.unpack next)
41+
)
42+
(Nothing, Nothing)
43+
. T.splitOn "."
44+
. T.pack
45+
$ moduleNameStr
46+
in ModulePathInfo (dirMay, Maybe.fromMaybe moduleNameStr fileNoExtensionMay)
47+
48+
getModuleInfoPath :: ModulePathInfo -> Maybe String -> String -> FilePath
49+
getModuleInfoPath (ModulePathInfo (dirMay, fileNoExtension)) suffixMay extension =
50+
let file = case suffixMay of
51+
Nothing -> fileNoExtension <> extension
52+
Just suffix -> fileNoExtension </> suffix <> extension
53+
in maybe file (</> file) dirMay
54+
55+
getModuleInfoDir :: ModulePathInfo -> FilePath
56+
getModuleInfoDir (ModulePathInfo (dirMay, fileNoExtension)) =
57+
maybe fileNoExtension (</> fileNoExtension) dirMay
758

859
data FixedValueStrategy = FixedValueStrategyExclude | FixedValueStrategyInclude
960
deriving (Eq, Bounded, Enum)

0 commit comments

Comments
 (0)