/
Main.hs
57 lines (45 loc) · 1.99 KB
/
Main.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
{-# LANGUAGE KindSignatures #-}
module Main where
import Elm (ElmType (..), toElmDecoderSource, toElmEncoderSource, toElmTypeSource)
import Servant.API ((:>))
import Servant.Elm (Spec (..), generateElmForAPI, specsToDir)
import Lib.Effects.User (User)
import Lib.Server (API)
type ExportTypes = '[User]
apiSpec :: Spec
apiSpec = Spec ["Generated", "Api"]
( "import Http"
: "import Json.Decode exposing (list, string)"
: "import Json.Encode"
: "import Generated.Types exposing (..)"
: "import Generated.Encoder exposing (..)"
: "import Generated.Decoder exposing (..)"
: generateElmForAPI (Proxy :: Proxy ("api" :> API))
)
class RenderElmType (exportTypes :: [*]) where
renderType :: Proxy exportTypes -> [Text]
renderEncoder :: Proxy exportTypes -> [Text]
renderDecoder :: Proxy exportTypes -> [Text]
instance RenderElmType '[] where
renderType = const []
renderEncoder = const []
renderDecoder = const []
instance (ElmType t, RenderElmType ts) => RenderElmType (t ': ts) where
renderType _ = [toElmTypeSource $ Proxy @t] <> renderType (Proxy @ts)
renderEncoder _ = [toElmEncoderSource $ Proxy @t] <> renderEncoder (Proxy @ts)
renderDecoder _ = [toElmDecoderSource $ Proxy @t] <> renderDecoder (Proxy @ts)
typeSpec :: Spec
typeSpec = Spec ["Generated", "Types"] $ renderType (Proxy @ExportTypes)
encoderSpec :: Spec
encoderSpec = Spec ["Generated", "Encoder"] $
[ "import Json.Encode exposing (..)"
, "import Generated.Types exposing (..)"
] <> renderEncoder (Proxy @ExportTypes)
decoderSpec :: Spec
decoderSpec = Spec ["Generated", "Decoder"] $
[ "import Json.Decode exposing (..)"
, "import Json.Decode.Pipeline exposing (..)"
, "import Generated.Types exposing (..)"
] <> renderDecoder (Proxy @ExportTypes)
main :: IO ()
main = specsToDir [apiSpec, typeSpec, encoderSpec, decoderSpec] "../frontend/src/elm"