packages feed

servant-kotlin-0.1.1.1: example/Generater.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE DeriveAnyClass    #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators     #-}

module Main where

import           Data.Aeson                  (FromJSON, ToJSON)
import           Data.Proxy                  (Proxy (Proxy))
import           Data.Text                   (Text)
import           GHC.Generics                (Generic)
import           Servant.API                 ((:<|>) (..), (:>), Capture,
                                              Delete, FormUrlEncoded, Get, JSON,
                                              Post, Put, ReqBody)
import           Servant.Kotlin
import           Shelly                      (cd, run_, shelly, which)
import           Web.Internal.FormUrlEncoded (FromForm)

data Todo = Todo
  { todoId :: Int
  , title  :: Text
  , done   :: Bool
  } deriving (Generic, Show, Eq, KotlinType)

instance FromJSON Todo
instance ToJSON Todo
instance FromForm Todo

type CRUD = "todos" :> Get '[JSON] [Todo]
       :<|> "todos" :> ReqBody '[JSON, FormUrlEncoded] Todo :> Post '[JSON] Todo
       :<|> "todos" :> Capture "id" Int :> ReqBody '[JSON, FormUrlEncoded] Todo :> Put '[JSON] ()
       :<|> "todos" :> Capture "id" Int :> Delete '[JSON] ()

body :: [Text]
body = mconcat
  [ [ defKotlinImports ]
  , generateKotlinForAPIClass "TodoAPI" $ mconcat
      [ generateKotlinForDefDataClass (Proxy :: Proxy Todo)
      , generateKotlinForAPI (Proxy :: Proxy CRUD)
      ]
  ]

spec :: Spec
spec = Spec ["com", "github", "matsubara0507"] "TodoAPI" body

main :: IO ()
main = do
  specsToDir [spec] "example/src/main/java"
  shelly $ do
    cd "example"
    which "gradle" >>= mapM_ (\_ -> run_ "gradle" ["build"])