module Site.Lang where import Data.Aeson (FromJSON (parseJSON), withText) import Data.Text qualified as Text import Relude import Prelude () -- * Type 'Lang' data Lang = LangDe | LangEn | LangFr | LangJp deriving (Bounded, Show, Enum, Eq) langText :: IsString a => Lang -> a langText = \case LangDe -> "Deutsch" LangEn -> "English" LangFr -> "français" LangJp -> "日本語" parseLang :: Text -> Maybe Lang parseLang = \case "de" -> Just LangDe "en" -> Just LangEn "fr" -> Just LangFr "jp" -> Just LangJp _ -> Nothing instance FromJSON Lang where parseJSON = withText "Lang" $ maybe (fail "expected a Lang") pure . parseLang textOfLang :: Lang -> Text textOfLang = Text.drop 4 . Text.toLower . show