module Hix.Managed.Data.ProjectStateProto where

import Data.Aeson (FromJSON (parseJSON), withObject, (.:?))
import Distribution.Pretty (Pretty (pretty))
import Text.PrettyPrint (hang, ($+$))

import Hix.Class.EncodeNix (EncodeNix)
import Hix.Data.Bounds (Bounds)
import Hix.Data.Json (foldMissing)
import Hix.Data.Overrides (Overrides)
import Hix.Data.Version (Versions)
import Hix.Managed.Data.Envs (Envs)
import Hix.Managed.Data.Packages (Packages)

data ProjectStateProto =
  ProjectStateProto {
    ProjectStateProto -> Packages Bounds
bounds :: Packages Bounds,
    ProjectStateProto -> Envs Versions
versions :: Envs Versions,
    ProjectStateProto -> Envs Overrides
overrides :: Envs Overrides,
    ProjectStateProto -> Envs Versions
initial :: Envs Versions,
    ProjectStateProto -> Bool
resolving :: Bool
  }
  deriving stock (ProjectStateProto -> ProjectStateProto -> Bool
(ProjectStateProto -> ProjectStateProto -> Bool)
-> (ProjectStateProto -> ProjectStateProto -> Bool)
-> Eq ProjectStateProto
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ProjectStateProto -> ProjectStateProto -> Bool
== :: ProjectStateProto -> ProjectStateProto -> Bool
$c/= :: ProjectStateProto -> ProjectStateProto -> Bool
/= :: ProjectStateProto -> ProjectStateProto -> Bool
Eq, Int -> ProjectStateProto -> ShowS
[ProjectStateProto] -> ShowS
ProjectStateProto -> String
(Int -> ProjectStateProto -> ShowS)
-> (ProjectStateProto -> String)
-> ([ProjectStateProto] -> ShowS)
-> Show ProjectStateProto
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ProjectStateProto -> ShowS
showsPrec :: Int -> ProjectStateProto -> ShowS
$cshow :: ProjectStateProto -> String
show :: ProjectStateProto -> String
$cshowList :: [ProjectStateProto] -> ShowS
showList :: [ProjectStateProto] -> ShowS
Show, (forall x. ProjectStateProto -> Rep ProjectStateProto x)
-> (forall x. Rep ProjectStateProto x -> ProjectStateProto)
-> Generic ProjectStateProto
forall x. Rep ProjectStateProto x -> ProjectStateProto
forall x. ProjectStateProto -> Rep ProjectStateProto x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ProjectStateProto -> Rep ProjectStateProto x
from :: forall x. ProjectStateProto -> Rep ProjectStateProto x
$cto :: forall x. Rep ProjectStateProto x -> ProjectStateProto
to :: forall x. Rep ProjectStateProto x -> ProjectStateProto
Generic)
  deriving anyclass (ProjectStateProto -> Expr
(ProjectStateProto -> Expr) -> EncodeNix ProjectStateProto
forall a. (a -> Expr) -> EncodeNix a
$cencodeNix :: ProjectStateProto -> Expr
encodeNix :: ProjectStateProto -> Expr
EncodeNix)

instance Pretty ProjectStateProto where
  pretty :: ProjectStateProto -> Doc
pretty ProjectStateProto {Bool
Packages Bounds
Envs Versions
Envs Overrides
$sel:bounds:ProjectStateProto :: ProjectStateProto -> Packages Bounds
$sel:versions:ProjectStateProto :: ProjectStateProto -> Envs Versions
$sel:overrides:ProjectStateProto :: ProjectStateProto -> Envs Overrides
$sel:initial:ProjectStateProto :: ProjectStateProto -> Envs Versions
$sel:resolving:ProjectStateProto :: ProjectStateProto -> Bool
bounds :: Packages Bounds
versions :: Envs Versions
overrides :: Envs Overrides
initial :: Envs Versions
resolving :: Bool
..} =
    Doc -> Int -> Doc -> Doc
hang Doc
"bounds:" Int
2 (Packages Bounds -> Doc
forall a. Pretty a => a -> Doc
pretty Packages Bounds
bounds) Doc -> Doc -> Doc
$+$
    Doc -> Int -> Doc -> Doc
hang Doc
"versions:" Int
2 (Envs Versions -> Doc
forall a. Pretty a => a -> Doc
pretty Envs Versions
versions) Doc -> Doc -> Doc
$+$
    Doc -> Int -> Doc -> Doc
hang Doc
"overrides:" Int
2 (Envs Overrides -> Doc
forall a. Pretty a => a -> Doc
pretty Envs Overrides
overrides) Doc -> Doc -> Doc
$+$
    Doc -> Int -> Doc -> Doc
hang Doc
"initial:" Int
2 (Envs Versions -> Doc
forall a. Pretty a => a -> Doc
pretty Envs Versions
initial)

instance FromJSON ProjectStateProto where
  parseJSON :: Value -> Parser ProjectStateProto
parseJSON = String
-> (Object -> Parser ProjectStateProto)
-> Value
-> Parser ProjectStateProto
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ProjectStateProto" \ Object
o -> do
    Packages Bounds
bounds <- Object -> Key -> Parser (Packages Bounds)
forall a. (Monoid a, FromJSON a) => Object -> Key -> Parser a
foldMissing Object
o Key
"bounds"
    Envs Versions
versions <- Object -> Key -> Parser (Envs Versions)
forall a. (Monoid a, FromJSON a) => Object -> Key -> Parser a
foldMissing Object
o Key
"versions"
    Envs Overrides
overrides <- Object -> Key -> Parser (Envs Overrides)
forall a. (Monoid a, FromJSON a) => Object -> Key -> Parser a
foldMissing Object
o Key
"overrides"
    Envs Versions
initial <- Object -> Key -> Parser (Envs Versions)
forall a. (Monoid a, FromJSON a) => Object -> Key -> Parser a
foldMissing Object
o Key
"initial"
    Bool
resolving <- Bool -> Maybe Bool -> Bool
forall a. a -> Maybe a -> a
fromMaybe Bool
False (Maybe Bool -> Bool) -> Parser (Maybe Bool) -> Parser Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser (Maybe Bool)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"resolving"
    pure ProjectStateProto {Bool
Packages Bounds
Envs Versions
Envs Overrides
$sel:bounds:ProjectStateProto :: Packages Bounds
$sel:versions:ProjectStateProto :: Envs Versions
$sel:overrides:ProjectStateProto :: Envs Overrides
$sel:initial:ProjectStateProto :: Envs Versions
$sel:resolving:ProjectStateProto :: Bool
bounds :: Packages Bounds
versions :: Envs Versions
overrides :: Envs Overrides
initial :: Envs Versions
resolving :: Bool
..}

instance Default ProjectStateProto where
  def :: ProjectStateProto
def =
    ProjectStateProto {
      $sel:bounds:ProjectStateProto :: Packages Bounds
bounds = Packages Bounds
forall a. Monoid a => a
mempty,
      $sel:versions:ProjectStateProto :: Envs Versions
versions = Envs Versions
forall a. Monoid a => a
mempty,
      $sel:overrides:ProjectStateProto :: Envs Overrides
overrides = Envs Overrides
forall a. Monoid a => a
mempty,
      $sel:initial:ProjectStateProto :: Envs Versions
initial = Envs Versions
forall a. Monoid a => a
mempty,
      $sel:resolving:ProjectStateProto :: Bool
resolving = Bool
False
    }