artifact-0.0.0.0: src/Artifact/Raw.hs
{-
Artifact
Copyright (C) 2018 Leif Metcalf
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
module Artifact.Raw where
import Artifact.Internal.Extensions
import GHC.Generics
import Control.Applicative
import qualified Data.Text as T
import Data.Aeson
data FirstResponseRaw = FirstResponseRaw
{ cdn_root :: T.Text
, url :: T.Text
, expire_time :: Int
} deriving (Generic, Show)
instance FromJSON FirstResponseRaw
data SecondResponseRaw = SecondResponseRaw
{ card_set :: CardSetRaw
} deriving (Generic, Show)
instance FromJSON SecondResponseRaw
data CardSetRaw = CardSetRaw
{ version :: Int
, set_info :: SetInfoRaw
, card_list :: [CardRaw]
} deriving (Generic, Show)
instance FromJSON CardSetRaw
data SetInfoRaw = SetInfoRaw
{ set_id :: Int
, pack_item_def :: Int
, name :: SetNameRaw
} deriving (Generic, Show)
instance FromJSON SetInfoRaw
data SetNameRaw = SetNameRaw
{ english :: T.Text
} deriving (Generic, Show)
instance FromJSON SetNameRaw
data CardRaw = CardHeroRaw HeroRaw
| CardPassiveRaw PassiveRaw
| CardActiveRaw ActiveRaw
| CardCreepRaw CreepRaw
| CardImprovementRaw ImprovementRaw
| CardItemRaw ItemRaw
| CardSpellRaw SpellRaw
deriving (Show)
instance FromJSON CardRaw
where parseJSON v = (CardHeroRaw <$> parseJSON v)
<|> (CardPassiveRaw <$> parseJSON v)
<|> (CardActiveRaw <$> parseJSON v)
<|> (CardCreepRaw <$> parseJSON v)
<|> (CardImprovementRaw <$> parseJSON v)
<|> (CardItemRaw <$> parseJSON v)
<|> (CardSpellRaw <$> parseJSON v)
data HeroRaw = HeroRaw
{ card_id :: Int
, base_card_id :: Int
, card_type :: T.Text
, card_name :: CardNameRaw
, mini_image :: CardImageRaw
, large_image :: CardImageRaw
, ingame_image :: CardImageRaw
, illustrator :: Maybe T.Text
, rarity :: T.Text
, is_blue :: Maybe Bool
, is_black :: Maybe Bool
, is_green :: Maybe Bool
, is_red :: Maybe Bool
, item_def :: Int
, attack :: Maybe Int
, armor :: Maybe Int
, hit_points :: Int
, references :: [ReferenceRaw]
} deriving (Show)
instance FromJSON HeroRaw where
parseJSON = withObject "Hero" $ \v -> do
card_id <- v .: "card_id"
base_card_id <- v .: "base_card_id"
card_type <- v .: "card_type" .:= "Hero"
card_name <- v .: "card_name"
mini_image <- v .: "mini_image"
large_image <- v .: "large_image"
ingame_image <- v .: "ingame_image"
illustrator <- v .:? "illustrator"
rarity <- v .: "rarity"
is_blue <- v .:? "is_blue"
is_black <- v .:? "is_black"
is_green <- v .:? "is_green"
is_red <- v .:? "is_red"
item_def <- v .: "item_def"
attack <- v .:? "attack"
armor <- v .:? "armor"
hit_points <- v .: "hit_points"
references <- v .: "references"
pure $ HeroRaw card_id
base_card_id
card_type
card_name
mini_image
large_image
ingame_image
illustrator
rarity
is_blue
is_black
is_green
is_red
item_def
attack
armor
hit_points
references
data PassiveRaw = PassiveRaw
{ card_id :: Int
, base_card_id :: Int
, card_type :: T.Text
, card_name :: CardNameRaw
, card_text :: CardTextRaw
, references :: [ReferenceRaw]
} deriving (Show)
instance FromJSON PassiveRaw where
parseJSON = withObject "Passive" $ \v -> do
card_id <- v .: "card_id"
base_card_id <- v .: "base_card_id"
card_type <- v .: "card_type" .:= "Passive Ability"
card_name <- v .: "card_name"
card_text <- v .: "card_text"
references <- v .: "references"
pure $ PassiveRaw card_id
base_card_id
card_type
card_name
card_text
references
data ActiveRaw = ActiveRaw
{ card_id :: Int
, base_card_id :: Int
, card_type :: T.Text
, card_name :: CardNameRaw
, card_text :: CardTextRaw
, references :: [ReferenceRaw]
} deriving (Show)
instance FromJSON ActiveRaw where
parseJSON = withObject "Active" $ \v -> do
card_id <- v .: "card_id"
base_card_id <- v .: "base_card_id"
card_type <- v .: "card_type" .:= "Ability"
card_name <- v .: "card_name"
card_text <- v .: "card_text"
references <- v .: "references"
pure $ ActiveRaw card_id
base_card_id
card_type
card_name
card_text
references
data CreepRaw = CreepRaw
{ card_id :: Int
, base_card_id :: Int
, card_type :: T.Text
, card_name :: CardNameRaw
, card_text :: CardTextRaw
, mini_image :: CardImageRaw
, large_image :: CardImageRaw
, illustrator :: Maybe T.Text
, rarity :: Maybe T.Text
, is_blue :: Maybe Bool
, is_black :: Maybe Bool
, is_green :: Maybe Bool
, is_red :: Maybe Bool
, mana_cost :: Int
, item_def :: Maybe Int
, attack :: Maybe Int
, armor :: Maybe Int
, hit_points :: Int
, references :: [ReferenceRaw]
} deriving (Show)
instance FromJSON CreepRaw where
parseJSON = withObject "Creep" $ \v -> do
card_id <- v .: "card_id"
base_card_id <- v .: "base_card_id"
card_type <- v .: "card_type" .:= "Creep"
card_name <- v .: "card_name"
card_text <- v .: "card_text"
mini_image <- v .: "mini_image"
large_image <- v .: "large_image"
illustrator <- v .:? "illustrator"
rarity <- v .:? "rarity"
is_blue <- v .:? "is_blue"
is_black <- v .:? "is_black"
is_green <- v .:? "is_green"
is_red <- v .:? "is_red"
mana_cost <- v .: "mana_cost"
item_def <- v .:? "item_def"
attack <- v .:? "attack"
armor <- v .:? "armor"
hit_points <- v .: "hit_points"
references <- v .: "references"
pure $ CreepRaw card_id
base_card_id
card_type
card_name
card_text
mini_image
large_image
illustrator
rarity
is_blue
is_black
is_green
is_red
mana_cost
item_def
attack
armor
hit_points
references
data ImprovementRaw = ImprovementRaw
{ card_id :: Int
, base_card_id :: Int
, card_type :: T.Text
, card_name :: CardNameRaw
, card_text :: CardTextRaw
, mini_image :: CardImageRaw
, large_image :: CardImageRaw
, illustrator :: Maybe T.Text
, rarity :: Maybe T.Text
, is_blue :: Maybe Bool
, is_black :: Maybe Bool
, is_green :: Maybe Bool
, is_red :: Maybe Bool
, mana_cost :: Int
, item_def :: Maybe Int
, references :: [ReferenceRaw]
} deriving (Show)
instance FromJSON ImprovementRaw where
parseJSON = withObject "Improvement" $ \v -> do
card_id <- v .: "card_id"
base_card_id <- v .: "base_card_id"
card_type <- v .: "card_type" .:= "Improvement"
card_name <- v .: "card_name"
card_text <- v .: "card_text"
mini_image <- v .: "mini_image"
large_image <- v .: "large_image"
illustrator <- v .:? "illustrator"
rarity <- v .:? "rarity"
is_blue <- v .:? "is_blue"
is_black <- v .:? "is_black"
is_green <- v .:? "is_green"
is_red <- v .:? "is_red"
mana_cost <- v .: "mana_cost"
item_def <- v .:? "item_def"
references <- v .: "references"
pure $ ImprovementRaw card_id
base_card_id
card_type
card_name
card_text
mini_image
large_image
illustrator
rarity
is_blue
is_black
is_green
is_red
mana_cost
item_def
references
data ItemRaw = ItemRaw
{ card_id :: Int
, base_card_id :: Int
, card_type :: T.Text
, card_name :: CardNameRaw
, card_text :: CardTextRaw
, mini_image :: CardImageRaw
, large_image :: CardImageRaw
, illustrator :: Maybe T.Text
, rarity :: Maybe T.Text
, sub_type :: T.Text
, gold_cost :: Int
, item_def :: Maybe Int
, references :: [ReferenceRaw]
} deriving (Show)
instance FromJSON ItemRaw where
parseJSON = withObject "Item" $ \v -> do
card_id <- v .: "card_id"
base_card_id <- v .: "base_card_id"
card_type <- v .: "card_type" .:= "Item"
card_name <- v .: "card_name"
card_text <- v .: "card_text"
mini_image <- v .: "mini_image"
large_image <- v .: "large_image"
illustrator <- v .:? "illustrator"
rarity <- v .:? "rarity"
sub_type <- v .: "sub_type"
gold_cost <- v .: "gold_cost"
item_def <- v .:? "item_def"
references <- v .: "references"
pure $ ItemRaw card_id
base_card_id
card_type
card_name
card_text
mini_image
large_image
illustrator
rarity
sub_type
gold_cost
item_def
references
data SpellRaw = SpellRaw
{ card_id :: Int
, base_card_id :: Int
, card_type :: T.Text
, card_name :: CardNameRaw
, card_text :: CardTextRaw
, mini_image :: CardImageRaw
, large_image :: CardImageRaw
, illustrator :: Maybe T.Text
, rarity :: Maybe T.Text
, is_blue :: Maybe Bool
, is_black :: Maybe Bool
, is_green :: Maybe Bool
, is_red :: Maybe Bool
, mana_cost :: Int
, item_def :: Maybe Int
, references :: [ReferenceRaw]
} deriving (Show)
instance FromJSON SpellRaw where
parseJSON = withObject "Spell" $ \v -> do
card_id <- v .: "card_id"
base_card_id <- v .: "base_card_id"
card_type <- v .: "card_type" .:= "Spell"
card_name <- v .: "card_name"
card_text <- v .: "card_text"
mini_image <- v .: "mini_image"
large_image <- v .: "large_image"
illustrator <- v .:? "illustrator"
rarity <- v .:? "rarity"
is_blue <- v .:? "is_blue"
is_black <- v .:? "is_black"
is_green <- v .:? "is_green"
is_red <- v .:? "is_red"
mana_cost <- v .: "mana_cost"
item_def <- v .:? "item_def"
references <- v .: "references"
pure $ SpellRaw card_id
base_card_id
card_type
card_name
card_text
mini_image
large_image
illustrator
rarity
is_blue
is_black
is_green
is_red
mana_cost
item_def
references
data CardNameRaw = CardNameRaw
{ english :: T.Text
} deriving (Generic, Show)
instance FromJSON CardNameRaw
data CardTextRaw = CardTextRaw
{ english :: Maybe T.Text
} deriving (Generic, Show)
instance FromJSON CardTextRaw
data CardImageRaw = CardImageRaw
{ _default :: T.Text
} deriving (Generic, Show)
instance FromJSON CardImageRaw where
parseJSON = genericParseJSON defaultOptions { fieldLabelModifier = drop 1 }
--suffixed with 'Ref' to avoid name clash
data ReferenceRaw = ReferenceIncludeRaw IncludeRefRaw
| ReferencePassiveRaw PassiveRefRaw
| ReferenceActiveRaw ActiveRefRaw
| ReferenceBasicRaw BasicRefRaw
deriving (Show)
instance FromJSON ReferenceRaw
where parseJSON v = (ReferenceIncludeRaw <$> parseJSON v)
<|> (ReferencePassiveRaw <$> parseJSON v)
<|> (ReferenceActiveRaw <$> parseJSON v)
<|> (ReferenceBasicRaw <$> parseJSON v)
data IncludeRefRaw = IncludeRefRaw
{ card_id :: Int
, ref_type :: T.Text
, count :: Int
} deriving (Show)
instance FromJSON IncludeRefRaw where
parseJSON = withObject "IncludeRef" $ \v -> do
card_id <- v .: "card_id"
ref_type <- v .: "ref_type" .:= "includes"
count <- v .: "count"
pure $ IncludeRefRaw card_id
ref_type
count
data PassiveRefRaw = PassiveRefRaw
{ card_id :: Int
, ref_type :: T.Text
} deriving (Show)
instance FromJSON PassiveRefRaw where
parseJSON = withObject "PassiveRef" $ \v -> do
card_id <- v .: "card_id"
ref_type <- v .: "ref_type" .:= "passive_ability"
pure $ PassiveRefRaw card_id
ref_type
data ActiveRefRaw = ActiveRefRaw
{ card_id :: Int
, ref_type :: T.Text
} deriving (Show)
instance FromJSON ActiveRefRaw where
parseJSON = withObject "ActiveRef" $ \v -> do
card_id <- v .: "card_id"
ref_type <- v .: "ref_type" .:= "active_ability"
pure $ ActiveRefRaw card_id
ref_type
data BasicRefRaw = BasicRefRaw
{ card_id :: Int
, ref_type :: T.Text
} deriving (Show)
instance FromJSON BasicRefRaw where
parseJSON = withObject "BasicRef" $ \v -> do
card_id <- v .: "card_id"
ref_type <- v .: "ref_type" .:= "references"
pure $ BasicRefRaw card_id
ref_type