module Basic where

import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.:?), (.=))
import qualified Data.Aeson as JSON
import GHC.Generics (Generic)
import qualified Gotyno.Helpers as Helpers
import Prelude

data Recruiter = Recruiter
  { Recruiter -> String
recruiterType :: !String,
    Recruiter -> String
recruiterName :: !String,
    Recruiter -> [Maybe String]
recruiterEmails :: ![Maybe String],
    Recruiter -> Maybe Recruiter
recruiterRecruiter :: !(Maybe Recruiter),
    Recruiter -> Integer
recruiterCreated :: !Integer
  }
  deriving (Recruiter -> Recruiter -> Bool
(Recruiter -> Recruiter -> Bool)
-> (Recruiter -> Recruiter -> Bool) -> Eq Recruiter
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Recruiter -> Recruiter -> Bool
$c/= :: Recruiter -> Recruiter -> Bool
== :: Recruiter -> Recruiter -> Bool
$c== :: Recruiter -> Recruiter -> Bool
Eq, Int -> Recruiter -> ShowS
[Recruiter] -> ShowS
Recruiter -> String
(Int -> Recruiter -> ShowS)
-> (Recruiter -> String)
-> ([Recruiter] -> ShowS)
-> Show Recruiter
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Recruiter] -> ShowS
$cshowList :: [Recruiter] -> ShowS
show :: Recruiter -> String
$cshow :: Recruiter -> String
showsPrec :: Int -> Recruiter -> ShowS
$cshowsPrec :: Int -> Recruiter -> ShowS
Show, (forall x. Recruiter -> Rep Recruiter x)
-> (forall x. Rep Recruiter x -> Recruiter) -> Generic Recruiter
forall x. Rep Recruiter x -> Recruiter
forall x. Recruiter -> Rep Recruiter x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Recruiter x -> Recruiter
$cfrom :: forall x. Recruiter -> Rep Recruiter x
Generic)

instance FromJSON Recruiter where
  parseJSON :: Value -> Parser Recruiter
parseJSON = String -> (Object -> Parser Recruiter) -> Value -> Parser Recruiter
forall a. String -> (Object -> Parser a) -> Value -> Parser a
JSON.withObject String
"Recruiter" ((Object -> Parser Recruiter) -> Value -> Parser Recruiter)
-> (Object -> Parser Recruiter) -> Value -> Parser Recruiter
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    String
recruiterType <- Object
o Object -> Text -> Parser String
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"type" Parser String -> (String -> Parser String) -> Parser String
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> String -> Parser String
forall a. (Eq a, Show a) => a -> a -> Parser a
Helpers.checkEqualTo String
"Recruiter"
    String
recruiterName <- Object
o Object -> Text -> Parser String
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"Name"
    [Maybe String]
recruiterEmails <- Object
o Object -> Text -> Parser [Maybe String]
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"emails"
    Maybe Recruiter
recruiterRecruiter <- Object
o Object -> Text -> Parser (Maybe Recruiter)
forall a. FromJSON a => Object -> Text -> Parser (Maybe a)
.:? Text
"recruiter"
    Helpers.StringEncodedInteger Integer
recruiterCreated <- Object
o Object -> Text -> Parser StringEncodedInteger
forall a. FromJSON a => Object -> Text -> Parser a
.: Text
"created"
    Recruiter -> Parser Recruiter
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Recruiter -> Parser Recruiter) -> Recruiter -> Parser Recruiter
forall a b. (a -> b) -> a -> b
$
      Recruiter :: String
-> String
-> [Maybe String]
-> Maybe Recruiter
-> Integer
-> Recruiter
Recruiter
        { String
recruiterType :: String
$sel:recruiterType:Recruiter :: String
recruiterType,
          String
recruiterName :: String
$sel:recruiterName:Recruiter :: String
recruiterName,
          [Maybe String]
recruiterEmails :: [Maybe String]
$sel:recruiterEmails:Recruiter :: [Maybe String]
recruiterEmails,
          Maybe Recruiter
recruiterRecruiter :: Maybe Recruiter
$sel:recruiterRecruiter:Recruiter :: Maybe Recruiter
recruiterRecruiter,
          Integer
recruiterCreated :: Integer
$sel:recruiterCreated:Recruiter :: Integer
recruiterCreated
        }

instance ToJSON Recruiter where
  toJSON :: Recruiter -> Value
toJSON Recruiter
value =
    [Pair] -> Value
JSON.object
      [ Text
"type" Text -> LiteralString -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Text -> LiteralString
Helpers.LiteralString Text
"Recruiter",
        Text
"name" Text -> String -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Recruiter -> String
recruiterName Recruiter
value,
        Text
"emails" Text -> [Maybe String] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Recruiter -> [Maybe String]
recruiterEmails Recruiter
value,
        Text
"recruiter" Text -> Maybe Recruiter -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Recruiter -> Maybe Recruiter
recruiterRecruiter Recruiter
value,
        Text
"created" Text -> StringEncodedInteger -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
.= Integer -> StringEncodedInteger
Helpers.StringEncodedInteger (Recruiter -> Integer
recruiterCreated Recruiter
value)
      ]

-- struct Recruiter {
--     type: "Recruiter"
--     Name: String
--     emails: [3]?String
--     recruiter: ?*Recruiter
--     created: U64
-- }