Skip to content

Instantly share code, notes, and snippets.

@SeungheonOh
Created October 19, 2021 18:33
Show Gist options
  • Save SeungheonOh/16d5572cb3f3788a3b717168a572e98d to your computer and use it in GitHub Desktop.
Save SeungheonOh/16d5572cb3f3788a3b717168a572e98d to your computer and use it in GitHub Desktop.
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE GADTs #-}
module Main where
import System.IO
import Data.Aeson
import Data.Aeson.Types
import qualified Data.ByteString.Lazy.UTF8 as BLU
class ConfigGenerator_ a where
generate :: a -> Maybe String
data ConfigGenerator where
ConfigGenerator :: (ConfigGenerator_ a) => a -> ConfigGenerator
newtype Vimrc = Vimrc Object
newtype TOML = TOML Object
data NoGen = NoGen
instance ConfigGenerator_ Vimrc where
generate (Vimrc a) = parseMaybe (.: "a") a
instance ConfigGenerator_ TOML where
generate (TOML a) = parseMaybe (.: "a") a
instance ConfigGenerator_ NoGen where
generate _ = Nothing
instance ConfigGenerator_ ConfigGenerator where
generate (ConfigGenerator gen) = generate gen
getGenerator :: Object -> ConfigGenerator
getGenerator o
| t == Just "vimrc" = ConfigGenerator $ Vimrc o
| t == Just "toml" = ConfigGenerator $ TOML o
| otherwise = ConfigGenerator NoGen
where
t = parseMaybe (.: "type") o :: Maybe String
makeConfig :: Maybe Object -> Maybe String
makeConfig obj = obj >>= (generate . Vimrc)
main :: IO ()
main = do
obj <- openFile "test.json" ReadMode >>= hGetContents
print $ (decode (BLU.fromString obj) :: Maybe Object) >>= (generate . getGenerator)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment