integrated haskell backend with elm-street

This commit is contained in:
mtgmonkey 2025-05-06 20:34:50 -04:00
parent c86f613ccc
commit d6d84423e0
12 changed files with 573 additions and 273 deletions

View file

@ -1,7 +1,8 @@
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Lib
import ElmskellTypes
import Data.Text.Lazy (Text)
import Network.Wai.Handler.Warp (Port)
import Network.Wai.Middleware.RequestLogger (logStdoutDev)
@ -46,6 +47,9 @@ assetsFolder = "/home/mtgmonkey/elmskell/assets"
-- MAIN
main :: IO ()
main = do
generateElmskellTypes
compiledElmAppOrExc <- E.try $ readFile $ assetsFolder ++ compiledElmAppFile :: IO (Either E.IOException String)
let compiledElmApp = case compiledElmAppOrExc of
Left e -> serverErrorReadFile e

View file

@ -28,11 +28,12 @@ library
src
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints
build-depends:
base >=4.19.2 && <4.20
aeson >=2.2.3 && <2.3
, base >=4.19.2 && <4.20
, blaze-html >=0.9.2 && <0.10
, blaze-markup >=0.8.3 && <0.9
, directory >=1.3.8 && <1.4
, elm-bridge >=0.8.4 && <0.9
, elm-street >=0.2.2 && <0.3
, http-types >=0.12.4 && <0.13
, scotty ==0.22.*
, text >=2.1.1 && <2.2
@ -50,11 +51,12 @@ executable hs-server-exe
app
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
build-depends:
base >=4.19.2 && <4.20
aeson >=2.2.3 && <2.3
, base >=4.19.2 && <4.20
, blaze-html >=0.9.2 && <0.10
, blaze-markup >=0.8.3 && <0.9
, directory >=1.3.8 && <1.4
, elm-bridge >=0.8.4 && <0.9
, elm-street >=0.2.2 && <0.3
, hs-server
, http-types >=0.12.4 && <0.13
, scotty ==0.22.*
@ -74,11 +76,12 @@ test-suite hs-server-test
test
ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N
build-depends:
base >=4.19.2 && <4.20
aeson >=2.2.3 && <2.3
, base >=4.19.2 && <4.20
, blaze-html >=0.9.2 && <0.10
, blaze-markup >=0.8.3 && <0.9
, directory >=1.3.8 && <1.4
, elm-bridge >=0.8.4 && <0.9
, elm-street >=0.2.2 && <0.3
, hs-server
, http-types >=0.12.4 && <0.13
, scotty ==0.22.*

View file

@ -19,10 +19,12 @@ extra-source-files:
description: Please see README.md
dependencies:
- aeson >= 2.2.3 && < 2.3
- base >= 4.19.2 && < 4.20
- blaze-html >= 0.9.2 && < 0.10
- blaze-markup >= 0.8.3 && < 0.9
- directory >= 1.3.8 && < 1.4
- elm-street >= 0.2.2 && < 0.3
- http-types >= 0.12.4 && < 0.13
- scotty >= 0.22 && < 0.23
- text >= 2.1.1 && < 2.2

View file

@ -1,20 +1,106 @@
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE TypeApplications #-}
module ElmskellTypes
module ElmskellTypes (generateElmskellTypes) where
import Elm.Derive
import Elm.Module
import Data.Aeson (ToJSON (..), FromJSON (..))
import Elm
import GHC.Generics
data Foo
= Foo
{ name :: String
, blablub :: Int
} deriving (Show, Eq)
data Font = Font
{ fontFontSize :: Float
} deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet Font
deriveBoth defaultOptions ''Foo
data Cookies = Cookies
{ cookiesFont :: Font
, cookiesCookiesKept :: CookiesKept
, cookiesTheme :: Theme
, cookiesPrompt :: Prompt
} deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet Cookies
main :: IO ()
main =
putStrLn $ makeElmModule "Foo"
[ DefineElm (Proxy :: Proxy Foo)
data Theme
= Pit
| Dim
| Sky
| Sun
deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet Theme
data CookiesKept = CookiesKept
{ cookiesKeptKeepTheme :: Bool
, cookiesKeptKeepFont :: Bool
, cookiesKeptKeepPrompt :: Bool
} deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet CookiesKept
data Prompt = Prompt
{ promptPrompt :: String
} deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet Prompt
data CoreColor
= Red
| Green
| Yellow
| Blue
| Magenta
| Cyan
| BrightRed
| BrightGreen
| BrightYellow
| BrightBlue
| BrightMagenta
| BrightCyan
deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet CoreColor
data ThemeColor
= Background
| Foreground
| Cursor
| Black
| White
| BrightBlack
| BrightWhite
deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet ThemeColor
data Command
= HelpCommand
| ClearCommand
| ColorsCommand
| CookiesCommand
| FontCommand
| HelloCommand
| PromptCommand
| ThemeCommand
| TodoCommand
deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet Command
data Input = Input
{ inputCommand :: Command
, inputArgs :: [String]
}
deriving (Generic)
deriving (Elm, ToJSON, FromJSON) via ElmStreet Input
type Types =
'[Font
, Cookies
, Theme
, CookiesKept
, Prompt
, CoreColor
, ThemeColor
, Command
, Input
]
generateElmskellTypes :: IO ()
generateElmskellTypes = generateElm @Types $ defaultSettings "frontend/src" ["ElmskellTypes", "Generated"]