Something went wrong. Try again.
Define datatypes once, get polyglot results
Something went wrong. Try again.
4.7 kB · 143 lines
Haskell
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144{-# LANGUAGE OverloadedStrings #-}
module DataTypeTool.Config.Config where
import qualified Antelude.List as Listimport qualified Antelude.List.NonEmpty as NEimport qualified Antelude.Maybe as Maybeimport qualified Antelude.Tuple.Pair as Pair
import Control.Applicative
import qualified Data.Map.Strict as Mapimport qualified Data.Text as Textimport qualified Data.Version as Version
import qualified DataTypeTool.Lang.DTT.Config as DTTConfigimport qualified DataTypeTool.Lang.Elm.Config as ElmConfigimport qualified DataTypeTool.Lang.Elm.Toml as ElmTomlimport qualified DataTypeTool.Lang.Gleam.Config as GleamConfigimport qualified DataTypeTool.Lang.Gleam.Toml as GleamTomlimport qualified DataTypeTool.Lang.Haskell.Config as HaskellConfigimport qualified DataTypeTool.Lang.Haskell.Toml as HaskellTomlimport qualified DataTypeTool.Lang.Python.Config as PythonConfigimport qualified DataTypeTool.Lang.Python.Toml as PythonTomlimport qualified DataTypeTool.Lang.Python.Writer as PythonWriteimport qualified DataTypeTool.Parsing.Types as PT
import Toml ( (.=) )import qualified Toml
data Config = Config { sources :: FilePath , spacing :: Spacing , targets :: NonEmpty LangConfiguration }
datatypetoolCodec :: Toml.TomlCodec ConfigdatatypetoolCodec = Config <$> Toml.table (Toml.string "sources") "datatypetool" .= sources <*> Toml.table ( Toml.dioptional ( Toml.dimap fromSpacing toSpacing (Toml.string "spacing") ) |> Toml.dimap Just (Maybe.withDefault Spaces4) ) "datatypetool" .= spacing <*> ( Toml.tableMap Toml._KeyText indvLangCodec "targets" |> parseTableAsNEList ) .= targets
data Spacing = Tabs | Spaces2 | Spaces3 | Spaces4 deriving (Eq, Ord, Show)
toSpacing :: String -> SpacingtoSpacing "tabs" = TabstoSpacing "spaces2" = Spaces2toSpacing "spaces3" = Spaces3toSpacing "spaces4" = Spaces4
fromSpacing :: Spacing -> StringfromSpacing Tabs = "tabs"fromSpacing Spaces2 = "spaces2"fromSpacing Spaces3 = "spaces3"fromSpacing Spaces4 = "spaces4"
data LangConfiguration = EmptyConfig | Python PythonConfig.LangConf | Haskell HaskellConfig.LangConf | Elm ElmConfig.LangConf | Gleam GleamConfig.LangConf
parseTableAsNEList :: Toml.TomlCodec (Map.Map Text LangConfiguration) -> Toml.TomlCodec (NE.NonEmpty LangConfiguration)parseTableAsNEList = Toml.dimap ( NE.toList .> List.map (\a -> (langNameString a, a)) .> Map.fromList ) ( Map.toList .> List.map Pair.second .> NE.fromList .> Maybe.withDefault (EmptyConfig :| []) )
langNameString :: LangConfiguration -> TextlangNameString (Python _) = "python"langNameString (Haskell _) = "haskell"langNameString (Elm _) = "elm"langNameString (Gleam _) = "gleam"
matchPython :: LangConfiguration -> Maybe PythonConfig.LangConfmatchPython (Python cnf) = Just cnfmatchPython _ = Nothing
matchHaskell :: LangConfiguration -> Maybe HaskellConfig.LangConfmatchHaskell (Haskell cnf) = Just cnfmatchHaskell _ = Nothing
matchElm :: LangConfiguration -> Maybe ElmConfig.LangConfmatchElm (Elm cnf) = Just cnfmatchElm _ = Nothing
matchGleam :: LangConfiguration -> Maybe GleamConfig.LangConfmatchGleam (Gleam cnf) = Just cnfmatchGleam _ = Nothing
indvLangCodec :: Toml.Key -> Toml.TomlCodec LangConfigurationindvLangCodec "python" = Toml.dimatch matchPython Python (Toml.table PythonToml.confCodec "python")indvLangCodec "haskell" = Toml.dimatch matchHaskell Haskell (Toml.table HaskellToml.confCodec "haskell")indvLangCodec "gleam" = Toml.dimatch matchGleam Gleam (Toml.table GleamToml.confCodec "gleam")indvLangCodec "elm" = Toml.dimatch matchElm Elm (Toml.table ElmToml.confCodec "elm")
runLangWriter :: LangConfiguration -> (FilePath -> [(FilePath, [PT.DataTypes])] -> IO ())runLangWriter (Python cnf) = PythonConfig.langWriter cnf cnfrunLangWriter (Haskell cnf) = HaskellConfig.langWriter cnf cnfrunLangWriter (Elm cnf) = ElmConfig.langWriter cnf cnfrunLangWriter (Gleam cnf) = GleamConfig.langWriter cnf cnf