{-# LANGUAGE OverloadedStrings #-}

module OpenAPI.Generate.OptParse.Types
  ( FixedValueStrategy (..),
    ModuleName,
    ModulePathInfo,
    mkModuleName,
    getModuleName,
    mkModulePathInfo,
    getModuleInfoPath,
    getModuleInfoDir,
  )
where

import Autodocodec
import qualified Data.Maybe as Maybe
import qualified Data.Text as T
import System.FilePath ((</>))

newtype ModuleName = ModuleName String
  deriving (Int -> ModuleName -> ShowS
[ModuleName] -> ShowS
ModuleName -> String
(Int -> ModuleName -> ShowS)
-> (ModuleName -> String)
-> ([ModuleName] -> ShowS)
-> Show ModuleName
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ModuleName -> ShowS
showsPrec :: Int -> ModuleName -> ShowS
$cshow :: ModuleName -> String
show :: ModuleName -> String
$cshowList :: [ModuleName] -> ShowS
showList :: [ModuleName] -> ShowS
Show, ModuleName -> ModuleName -> Bool
(ModuleName -> ModuleName -> Bool)
-> (ModuleName -> ModuleName -> Bool) -> Eq ModuleName
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ModuleName -> ModuleName -> Bool
== :: ModuleName -> ModuleName -> Bool
$c/= :: ModuleName -> ModuleName -> Bool
/= :: ModuleName -> ModuleName -> Bool
Eq)

newtype ModulePathInfo = ModulePathInfo (Maybe FilePath, FilePath)

mkModuleName :: String -> ModuleName
mkModuleName :: String -> ModuleName
mkModuleName = String -> ModuleName
ModuleName

getModuleName :: ModuleName -> String
getModuleName :: ModuleName -> String
getModuleName (ModuleName String
moduleNameStr) = String
moduleNameStr

mkModulePathInfo :: ModuleName -> ModulePathInfo
mkModulePathInfo :: ModuleName -> ModulePathInfo
mkModulePathInfo (ModuleName String
moduleNameStr) =
  let (Maybe String
dirMay, Maybe String
fileNoExtensionMay) =
        ((Maybe String, Maybe String)
 -> Text -> (Maybe String, Maybe String))
-> (Maybe String, Maybe String)
-> [Text]
-> (Maybe String, Maybe String)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl
          ( \(Maybe String, Maybe String)
acc Text
next ->
              let dMay :: Maybe String
dMay = case (Maybe String, Maybe String)
acc of
                    (Maybe String
Nothing, Just String
prev) -> String -> Maybe String
forall a. a -> Maybe a
Just String
prev
                    (Just String
dir, Just String
prev) -> String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ String
dir String -> ShowS
</> String
prev
                    (Maybe String
dMay', Maybe String
Nothing) -> Maybe String
dMay'
               in (Maybe String
dMay, String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> String -> Maybe String
forall a b. (a -> b) -> a -> b
$ Text -> String
T.unpack Text
next)
          )
          (Maybe String
forall a. Maybe a
Nothing, Maybe String
forall a. Maybe a
Nothing)
          ([Text] -> (Maybe String, Maybe String))
-> (String -> [Text]) -> String -> (Maybe String, Maybe String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HasCallStack => Text -> Text -> [Text]
Text -> Text -> [Text]
T.splitOn Text
"."
          (Text -> [Text]) -> (String -> Text) -> String -> [Text]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack
          (String -> (Maybe String, Maybe String))
-> String -> (Maybe String, Maybe String)
forall a b. (a -> b) -> a -> b
$ String
moduleNameStr
   in (Maybe String, String) -> ModulePathInfo
ModulePathInfo (Maybe String
dirMay, String -> Maybe String -> String
forall a. a -> Maybe a -> a
Maybe.fromMaybe String
moduleNameStr Maybe String
fileNoExtensionMay)

getModuleInfoPath :: ModulePathInfo -> Maybe String -> String -> FilePath
getModuleInfoPath :: ModulePathInfo -> Maybe String -> ShowS
getModuleInfoPath (ModulePathInfo (Maybe String
dirMay, String
fileNoExtension)) Maybe String
suffixMay String
extension =
  let file :: String
file = case Maybe String
suffixMay of
        Maybe String
Nothing -> String
fileNoExtension String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
extension
        Just String
suffix -> String
fileNoExtension String -> ShowS
</> String
suffix String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
extension
   in String -> ShowS -> Maybe String -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
file (String -> ShowS
</> String
file) Maybe String
dirMay

getModuleInfoDir :: ModulePathInfo -> FilePath
getModuleInfoDir :: ModulePathInfo -> String
getModuleInfoDir (ModulePathInfo (Maybe String
dirMay, String
fileNoExtension)) =
  String -> ShowS -> Maybe String -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
fileNoExtension (String -> ShowS
</> String
fileNoExtension) Maybe String
dirMay

data FixedValueStrategy = FixedValueStrategyExclude | FixedValueStrategyInclude
  deriving (FixedValueStrategy -> FixedValueStrategy -> Bool
(FixedValueStrategy -> FixedValueStrategy -> Bool)
-> (FixedValueStrategy -> FixedValueStrategy -> Bool)
-> Eq FixedValueStrategy
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FixedValueStrategy -> FixedValueStrategy -> Bool
== :: FixedValueStrategy -> FixedValueStrategy -> Bool
$c/= :: FixedValueStrategy -> FixedValueStrategy -> Bool
/= :: FixedValueStrategy -> FixedValueStrategy -> Bool
Eq, FixedValueStrategy
FixedValueStrategy
-> FixedValueStrategy -> Bounded FixedValueStrategy
forall a. a -> a -> Bounded a
$cminBound :: FixedValueStrategy
minBound :: FixedValueStrategy
$cmaxBound :: FixedValueStrategy
maxBound :: FixedValueStrategy
Bounded, Int -> FixedValueStrategy
FixedValueStrategy -> Int
FixedValueStrategy -> [FixedValueStrategy]
FixedValueStrategy -> FixedValueStrategy
FixedValueStrategy -> FixedValueStrategy -> [FixedValueStrategy]
FixedValueStrategy
-> FixedValueStrategy -> FixedValueStrategy -> [FixedValueStrategy]
(FixedValueStrategy -> FixedValueStrategy)
-> (FixedValueStrategy -> FixedValueStrategy)
-> (Int -> FixedValueStrategy)
-> (FixedValueStrategy -> Int)
-> (FixedValueStrategy -> [FixedValueStrategy])
-> (FixedValueStrategy
    -> FixedValueStrategy -> [FixedValueStrategy])
-> (FixedValueStrategy
    -> FixedValueStrategy -> [FixedValueStrategy])
-> (FixedValueStrategy
    -> FixedValueStrategy
    -> FixedValueStrategy
    -> [FixedValueStrategy])
-> Enum FixedValueStrategy
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FixedValueStrategy -> FixedValueStrategy
succ :: FixedValueStrategy -> FixedValueStrategy
$cpred :: FixedValueStrategy -> FixedValueStrategy
pred :: FixedValueStrategy -> FixedValueStrategy
$ctoEnum :: Int -> FixedValueStrategy
toEnum :: Int -> FixedValueStrategy
$cfromEnum :: FixedValueStrategy -> Int
fromEnum :: FixedValueStrategy -> Int
$cenumFrom :: FixedValueStrategy -> [FixedValueStrategy]
enumFrom :: FixedValueStrategy -> [FixedValueStrategy]
$cenumFromThen :: FixedValueStrategy -> FixedValueStrategy -> [FixedValueStrategy]
enumFromThen :: FixedValueStrategy -> FixedValueStrategy -> [FixedValueStrategy]
$cenumFromTo :: FixedValueStrategy -> FixedValueStrategy -> [FixedValueStrategy]
enumFromTo :: FixedValueStrategy -> FixedValueStrategy -> [FixedValueStrategy]
$cenumFromThenTo :: FixedValueStrategy
-> FixedValueStrategy -> FixedValueStrategy -> [FixedValueStrategy]
enumFromThenTo :: FixedValueStrategy
-> FixedValueStrategy -> FixedValueStrategy -> [FixedValueStrategy]
Enum)

instance Show FixedValueStrategy where
  show :: FixedValueStrategy -> String
show FixedValueStrategy
FixedValueStrategyExclude = String
"exclude"
  show FixedValueStrategy
FixedValueStrategyInclude = String
"include"

instance Read FixedValueStrategy where
  readsPrec :: Int -> ReadS FixedValueStrategy
readsPrec Int
_ (Char
'e' : Char
'x' : Char
'c' : Char
'l' : Char
'u' : Char
'd' : Char
'e' : String
rest) = [(FixedValueStrategy
FixedValueStrategyExclude, String
rest)]
  readsPrec Int
_ (Char
'i' : Char
'n' : Char
'c' : Char
'l' : Char
'u' : Char
'd' : Char
'e' : String
rest) = [(FixedValueStrategy
FixedValueStrategyInclude, String
rest)]
  readsPrec Int
_ String
_ = []

instance HasCodec FixedValueStrategy where
  codec :: JSONCodec FixedValueStrategy
codec = JSONCodec FixedValueStrategy
forall enum.
(Show enum, Eq enum, Enum enum, Bounded enum) =>
JSONCodec enum
shownBoundedEnumCodec