{-# LANGUAGE DeriveAnyClass #-}

module Hercules.API.Build.FailureGraph where

import Hercules.API.Derivation (Derivation)
import Hercules.API.Prelude

-- | A graph where each node is a failed (directly/indirectly) derivation
--   and edges represent a dependencies on other directly or indirectly failed
--   derivations.
data Graph = Graph
  { Graph -> [Node]
nodes :: [Node]
  }
  deriving ((forall x. Graph -> Rep Graph x)
-> (forall x. Rep Graph x -> Graph) -> Generic Graph
forall x. Rep Graph x -> Graph
forall x. Graph -> Rep Graph x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Graph x -> Graph
$cfrom :: forall x. Graph -> Rep Graph x
Generic, Int -> Graph -> ShowS
[Graph] -> ShowS
Graph -> String
(Int -> Graph -> ShowS)
-> (Graph -> String) -> ([Graph] -> ShowS) -> Show Graph
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Graph] -> ShowS
$cshowList :: [Graph] -> ShowS
show :: Graph -> String
$cshow :: Graph -> String
showsPrec :: Int -> Graph -> ShowS
$cshowsPrec :: Int -> Graph -> ShowS
Show, Graph -> Graph -> Bool
(Graph -> Graph -> Bool) -> (Graph -> Graph -> Bool) -> Eq Graph
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Graph -> Graph -> Bool
$c/= :: Graph -> Graph -> Bool
== :: Graph -> Graph -> Bool
$c== :: Graph -> Graph -> Bool
Eq, Graph -> ()
(Graph -> ()) -> NFData Graph
forall a. (a -> ()) -> NFData a
rnf :: Graph -> ()
$crnf :: Graph -> ()
NFData, [Graph] -> Encoding
[Graph] -> Value
Graph -> Encoding
Graph -> Value
(Graph -> Value)
-> (Graph -> Encoding)
-> ([Graph] -> Value)
-> ([Graph] -> Encoding)
-> ToJSON Graph
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Graph] -> Encoding
$ctoEncodingList :: [Graph] -> Encoding
toJSONList :: [Graph] -> Value
$ctoJSONList :: [Graph] -> Value
toEncoding :: Graph -> Encoding
$ctoEncoding :: Graph -> Encoding
toJSON :: Graph -> Value
$ctoJSON :: Graph -> Value
ToJSON, Value -> Parser [Graph]
Value -> Parser Graph
(Value -> Parser Graph)
-> (Value -> Parser [Graph]) -> FromJSON Graph
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Graph]
$cparseJSONList :: Value -> Parser [Graph]
parseJSON :: Value -> Parser Graph
$cparseJSON :: Value -> Parser Graph
FromJSON, Proxy Graph -> Declare (Definitions Schema) NamedSchema
(Proxy Graph -> Declare (Definitions Schema) NamedSchema)
-> ToSchema Graph
forall a.
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
declareNamedSchema :: Proxy Graph -> Declare (Definitions Schema) NamedSchema
$cdeclareNamedSchema :: Proxy Graph -> Declare (Definitions Schema) NamedSchema
ToSchema)

-- | A derivation and any dependencies that caused it to fail, if applicable.
data Node = Node
  { Node -> Derivation
derivation :: Derivation,
    -- | Dependency paths to failed dependencies that, if present, have caused a
    --   DependencyFailure for this derivation.
    Node -> [Text]
failedDependencies :: [Text]
  }
  deriving ((forall x. Node -> Rep Node x)
-> (forall x. Rep Node x -> Node) -> Generic Node
forall x. Rep Node x -> Node
forall x. Node -> Rep Node x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Node x -> Node
$cfrom :: forall x. Node -> Rep Node x
Generic, Int -> Node -> ShowS
[Node] -> ShowS
Node -> String
(Int -> Node -> ShowS)
-> (Node -> String) -> ([Node] -> ShowS) -> Show Node
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Node] -> ShowS
$cshowList :: [Node] -> ShowS
show :: Node -> String
$cshow :: Node -> String
showsPrec :: Int -> Node -> ShowS
$cshowsPrec :: Int -> Node -> ShowS
Show, Node -> Node -> Bool
(Node -> Node -> Bool) -> (Node -> Node -> Bool) -> Eq Node
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Node -> Node -> Bool
$c/= :: Node -> Node -> Bool
== :: Node -> Node -> Bool
$c== :: Node -> Node -> Bool
Eq, Node -> ()
(Node -> ()) -> NFData Node
forall a. (a -> ()) -> NFData a
rnf :: Node -> ()
$crnf :: Node -> ()
NFData, [Node] -> Encoding
[Node] -> Value
Node -> Encoding
Node -> Value
(Node -> Value)
-> (Node -> Encoding)
-> ([Node] -> Value)
-> ([Node] -> Encoding)
-> ToJSON Node
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [Node] -> Encoding
$ctoEncodingList :: [Node] -> Encoding
toJSONList :: [Node] -> Value
$ctoJSONList :: [Node] -> Value
toEncoding :: Node -> Encoding
$ctoEncoding :: Node -> Encoding
toJSON :: Node -> Value
$ctoJSON :: Node -> Value
ToJSON, Value -> Parser [Node]
Value -> Parser Node
(Value -> Parser Node) -> (Value -> Parser [Node]) -> FromJSON Node
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [Node]
$cparseJSONList :: Value -> Parser [Node]
parseJSON :: Value -> Parser Node
$cparseJSON :: Value -> Parser Node
FromJSON, Proxy Node -> Declare (Definitions Schema) NamedSchema
(Proxy Node -> Declare (Definitions Schema) NamedSchema)
-> ToSchema Node
forall a.
(Proxy a -> Declare (Definitions Schema) NamedSchema) -> ToSchema a
declareNamedSchema :: Proxy Node -> Declare (Definitions Schema) NamedSchema
$cdeclareNamedSchema :: Proxy Node -> Declare (Definitions Schema) NamedSchema
ToSchema)