packages feed

translate-cli-1.0.0.0: src/Lib.hs

{-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-}

module Lib(translateText) where

import Network.Wreq
import Control.Lens ((&), (^.), (.~))
import Data.Text (Text, pack)
import GHC.Generics (Generic)
import Data.Aeson

import Model

data Language = DeEn | EnDe

instance FromJSON Phrase
instance FromJSON Translation
instance FromJSON RestResponse

translateText :: String -> IO()
translateText phrase = do
    doRequest $ getLangOptions DeEn phrase
    doRequest $ getLangOptions EnDe phrase

apiBase :: String
apiBase = "https://glosbe.com/gapi_v0_1/translate"

doRequest :: Options -> IO()
doRequest options = do
    r <- getWith options apiBase
    let body = r ^. responseBody
        decoded = eitherDecode body :: Either String RestResponse
    printPhrases $ fmap (take 5 . toPhrases) decoded

getLangOptions :: Language -> String ->  Options
getLangOptions lang phrase =
    let (from, dest) =
            case lang of
                DeEn -> ("deu", "eng")
                EnDe -> ("eng", "deu")
    in defaults
    & param "phrase" .~ [pack phrase]
    & param "from" .~ [from]
    & param "dest" .~ [dest]
    & param "format" .~ ["json"]

printPhrases :: Either String [String] -> IO()
printPhrases phrases =
    case phrases of
        Left _ -> print "No result"
        Right phrases -> mapM_ putStrLn phrases