packages feed

flashblast-0.0.7.0: src/FlashBlast/Config.hs

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module FlashBlast.Config where

import qualified Dhall                  as D
import qualified Dhall.Deriving         as D
import           FlashBlast.ForvoClient
import           FlashBlast.VF
import           Path
import           Path.Dhall             ()
import           Optics.TH
import           RIO

data MultiClozeSpec = MultiClozeSpec {
  _phrases :: [Text]
, _images  :: [Path Rel File]
} deriving stock (Eq, Generic, Show)
  deriving (D.FromDhall, D.ToDhall)
    via D.Codec (D.Field (D.DropPrefix "_")) MultiClozeSpec

makeFieldsNoPrefix ''MultiClozeSpec

data YDLInfo = YDLInfo {
  _url    :: Text
, _out    :: Path Rel File
, _format :: Text
} deriving stock (Eq, Generic, Show)
  deriving (D.FromDhall, D.ToDhall)
    via D.Codec (D.Field (D.DropPrefix "_")) YDLInfo

makeFieldsNoPrefix ''YDLInfo

data ResourceDirs = ResourceDirs {
  _audio  :: Path Rel Dir
, _video  :: Path Rel Dir
, _images :: Path Rel Dir
} deriving stock (Eq, Generic, Show)
  deriving (D.FromDhall, D.ToDhall)
    via D.Codec (D.Field (D.DropPrefix "_")) ResourceDirs

makeFieldsNoPrefix ''ResourceDirs

data VideoSource = LocalVideo (Path Rel File) | YouTubeDL YDLInfo
  deriving stock (Eq, Generic, Show)
  deriving (D.FromDhall, D.ToDhall)
    via D.Codec (D.Field (D.DropPrefix "_")) VideoSource

makePrisms ''VideoSource

data ExcerptSpec = ExcerptSpec {
  _source :: VideoSource
, _subs   :: Text
, _clipf  :: Text -> Path Rel File
, _audiof :: Text -> Path Rel File
, _framef :: Text -> Path Rel File
} deriving stock Generic
  deriving D.FromDhall
    via D.Codec (D.Field (D.DropPrefix "_")) ExcerptSpec

makeFieldsNoPrefix ''ExcerptSpec

data ExportDirs = ExportDirs {
  _audio  :: Path Rel Dir
, _clips  :: Path Rel Dir
, _images :: Path Rel Dir
, _notes  :: Path Rel Dir
} deriving stock (Eq, Generic, Show)
  deriving (D.FromDhall, D.ToDhall)
    via D.Codec (D.Field (D.DropPrefix "_")) ExportDirs

makeFieldsNoPrefix ''ExportDirs

newtype Speaker = Speaker Text
  deriving (Eq, Show, Generic)

instance D.FromDhall Locale
instance D.ToDhall Locale

instance D.FromDhall Speaker
instance D.ToDhall Speaker

data ForvoSpec = ForvoSpec {
  _locale            :: Locale
} deriving stock (Eq, Generic, Show)
  deriving (D.FromDhall, D.ToDhall)
    via D.Codec (D.Field (D.DropPrefix "_")) ForvoSpec

makeFieldsNoPrefix ''ForvoSpec

data PronunciationSpec = PronunciationSpec {
  _audiof  :: Text -> Path Rel File
, _multis :: [MultiClozeSpec]
, _forvo  :: Maybe ForvoSpec
} deriving stock Generic
  deriving D.FromDhall
    via D.Codec (D.Field (D.DropPrefix "_")) PronunciationSpec

makeFieldsNoPrefix ''PronunciationSpec

data BasicReversedCard = BasicReversedCard {
  _front       :: VF
, _front_extra :: VFC
, _back        :: VF
, _back_extra  :: VFC
} deriving stock (Eq, Generic, Show)
  deriving (D.FromDhall, D.ToDhall)
    via D.Codec (D.Field (D.DropPrefix "_")) BasicReversedCard

makeFieldsNoPrefix ''BasicReversedCard

data MinimalReversedCard = MinimalReversedCard {
  _front :: VF
, _back  :: VF
} deriving stock (Eq, Show, Generic)
  deriving (D.FromDhall, D.ToDhall)
    via D.Codec (D.Field (D.DropPrefix "_")) MinimalReversedCard

makeFieldsNoPrefix ''MinimalReversedCard

data Spec =
    Pronunciation   [PronunciationSpec]
  | Excerpt         [ExcerptSpec]
  | BasicReversed   [BasicReversedCard]
  | MinimalReversed [MinimalReversedCard]
    deriving stock Generic
    deriving D.FromDhall
      via D.Codec (D.Field (D.DropPrefix "_")) Spec

makePrisms ''Spec

instance D.FromDhall ForvoAPIKey

data Part = Part {
  _outfile :: Path Rel File
, _spec    :: Spec
} deriving Generic
  deriving D.FromDhall
    via D.Codec (D.Field (D.DropPrefix "_")) Part

makeFieldsNoPrefix ''Part

data Deck = Deck {
  _resourceDirs :: ResourceDirs
, _exportDirs   :: ExportDirs
, _parts        :: [Part]
} deriving stock Generic
  deriving D.FromDhall
    via D.Codec (D.Field (D.DropPrefix "_")) Deck

makeFieldsNoPrefix ''Deck

type Deckname = Text

data FlashBlast = FlashBlast {
  _decks       :: Map Deckname Deck
, _forvoApiKey :: Maybe ForvoAPIKey
} deriving stock Generic
  deriving D.FromDhall
    via D.Codec (D.Field (D.DropPrefix "_")) FlashBlast

makeFieldsNoPrefix ''FlashBlast