{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DuplicateRecordFields #-} import Data.Aeson import GHC.Generics import System.Directory import System.Environment import System.FilePath import qualified Data.ByteString.Lazy as BS data NorwegianWord = NorwegianWord { word :: String , hints :: Maybe [String] } deriving (Generic, Show) instance FromJSON NorwegianWord instance ToJSON NorwegianWord where toEncoding = genericToEncoding defaultOptions data JapaneseWord = JapaneseWord { word :: String , romaji :: Maybe String , hints :: Maybe [String] } deriving (Generic, Show) instance FromJSON JapaneseWord instance ToJSON JapaneseWord where toEncoding = genericToEncoding defaultOptions data Card = Card { norwegian :: [NorwegianWord] , japanese :: [JapaneseWord] } deriving (Generic, Show) instance FromJSON Card instance ToJSON Card where toEncoding = genericToEncoding defaultOptions readJsonFile :: FilePath -> IO (Either String [Card]) readJsonFile path = eitherDecode <$> BS.readFile path main :: IO () main = do dir <- head <$> getArgs filePaths <- map (\x -> joinPath [dir, x]) <$> listDirectory dir jsonFiles <- mapM readJsonFile filePaths -- case jsonFiles of -- Right cards -> mapM_ print cards -- Left err -> putStr err