{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

module Ouroboros.Network.PeerSelection.Types
  ( PeerSource (..)
  , PeerAdvertise (..)
  , PeerStatus (..)
  ) where

import           Data.Aeson
import           Data.Bool (bool)
import           GHC.Generics (Generic)


-- | Where did this peer come from? Policy functions can choose to treat
-- peers differently depending on where we found them from.
--
data PeerSource = PeerSourceLocalRoot
                | PeerSourcePublicRoot
                | PeerSourceGossip
  deriving (PeerSource -> PeerSource -> Bool
(PeerSource -> PeerSource -> Bool)
-> (PeerSource -> PeerSource -> Bool) -> Eq PeerSource
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PeerSource -> PeerSource -> Bool
$c/= :: PeerSource -> PeerSource -> Bool
== :: PeerSource -> PeerSource -> Bool
$c== :: PeerSource -> PeerSource -> Bool
Eq, Eq PeerSource
Eq PeerSource
-> (PeerSource -> PeerSource -> Ordering)
-> (PeerSource -> PeerSource -> Bool)
-> (PeerSource -> PeerSource -> Bool)
-> (PeerSource -> PeerSource -> Bool)
-> (PeerSource -> PeerSource -> Bool)
-> (PeerSource -> PeerSource -> PeerSource)
-> (PeerSource -> PeerSource -> PeerSource)
-> Ord PeerSource
PeerSource -> PeerSource -> Bool
PeerSource -> PeerSource -> Ordering
PeerSource -> PeerSource -> PeerSource
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PeerSource -> PeerSource -> PeerSource
$cmin :: PeerSource -> PeerSource -> PeerSource
max :: PeerSource -> PeerSource -> PeerSource
$cmax :: PeerSource -> PeerSource -> PeerSource
>= :: PeerSource -> PeerSource -> Bool
$c>= :: PeerSource -> PeerSource -> Bool
> :: PeerSource -> PeerSource -> Bool
$c> :: PeerSource -> PeerSource -> Bool
<= :: PeerSource -> PeerSource -> Bool
$c<= :: PeerSource -> PeerSource -> Bool
< :: PeerSource -> PeerSource -> Bool
$c< :: PeerSource -> PeerSource -> Bool
compare :: PeerSource -> PeerSource -> Ordering
$ccompare :: PeerSource -> PeerSource -> Ordering
$cp1Ord :: Eq PeerSource
Ord, Int -> PeerSource -> ShowS
[PeerSource] -> ShowS
PeerSource -> String
(Int -> PeerSource -> ShowS)
-> (PeerSource -> String)
-> ([PeerSource] -> ShowS)
-> Show PeerSource
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PeerSource] -> ShowS
$cshowList :: [PeerSource] -> ShowS
show :: PeerSource -> String
$cshow :: PeerSource -> String
showsPrec :: Int -> PeerSource -> ShowS
$cshowsPrec :: Int -> PeerSource -> ShowS
Show, Int -> PeerSource
PeerSource -> Int
PeerSource -> [PeerSource]
PeerSource -> PeerSource
PeerSource -> PeerSource -> [PeerSource]
PeerSource -> PeerSource -> PeerSource -> [PeerSource]
(PeerSource -> PeerSource)
-> (PeerSource -> PeerSource)
-> (Int -> PeerSource)
-> (PeerSource -> Int)
-> (PeerSource -> [PeerSource])
-> (PeerSource -> PeerSource -> [PeerSource])
-> (PeerSource -> PeerSource -> [PeerSource])
-> (PeerSource -> PeerSource -> PeerSource -> [PeerSource])
-> Enum PeerSource
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: PeerSource -> PeerSource -> PeerSource -> [PeerSource]
$cenumFromThenTo :: PeerSource -> PeerSource -> PeerSource -> [PeerSource]
enumFromTo :: PeerSource -> PeerSource -> [PeerSource]
$cenumFromTo :: PeerSource -> PeerSource -> [PeerSource]
enumFromThen :: PeerSource -> PeerSource -> [PeerSource]
$cenumFromThen :: PeerSource -> PeerSource -> [PeerSource]
enumFrom :: PeerSource -> [PeerSource]
$cenumFrom :: PeerSource -> [PeerSource]
fromEnum :: PeerSource -> Int
$cfromEnum :: PeerSource -> Int
toEnum :: Int -> PeerSource
$ctoEnum :: Int -> PeerSource
pred :: PeerSource -> PeerSource
$cpred :: PeerSource -> PeerSource
succ :: PeerSource -> PeerSource
$csucc :: PeerSource -> PeerSource
Enum)


-- | Should this peer be advertised to other peers asking for known peers?
-- For certain peers specified by configuration it would be an appropriate
-- policy to keep them private.
--
data PeerAdvertise = DoNotAdvertisePeer
                   | DoAdvertisePeer
  deriving (PeerAdvertise -> PeerAdvertise -> Bool
(PeerAdvertise -> PeerAdvertise -> Bool)
-> (PeerAdvertise -> PeerAdvertise -> Bool) -> Eq PeerAdvertise
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PeerAdvertise -> PeerAdvertise -> Bool
$c/= :: PeerAdvertise -> PeerAdvertise -> Bool
== :: PeerAdvertise -> PeerAdvertise -> Bool
$c== :: PeerAdvertise -> PeerAdvertise -> Bool
Eq, Int -> PeerAdvertise -> ShowS
[PeerAdvertise] -> ShowS
PeerAdvertise -> String
(Int -> PeerAdvertise -> ShowS)
-> (PeerAdvertise -> String)
-> ([PeerAdvertise] -> ShowS)
-> Show PeerAdvertise
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PeerAdvertise] -> ShowS
$cshowList :: [PeerAdvertise] -> ShowS
show :: PeerAdvertise -> String
$cshow :: PeerAdvertise -> String
showsPrec :: Int -> PeerAdvertise -> ShowS
$cshowsPrec :: Int -> PeerAdvertise -> ShowS
Show, Eq PeerAdvertise
Eq PeerAdvertise
-> (PeerAdvertise -> PeerAdvertise -> Ordering)
-> (PeerAdvertise -> PeerAdvertise -> Bool)
-> (PeerAdvertise -> PeerAdvertise -> Bool)
-> (PeerAdvertise -> PeerAdvertise -> Bool)
-> (PeerAdvertise -> PeerAdvertise -> Bool)
-> (PeerAdvertise -> PeerAdvertise -> PeerAdvertise)
-> (PeerAdvertise -> PeerAdvertise -> PeerAdvertise)
-> Ord PeerAdvertise
PeerAdvertise -> PeerAdvertise -> Bool
PeerAdvertise -> PeerAdvertise -> Ordering
PeerAdvertise -> PeerAdvertise -> PeerAdvertise
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PeerAdvertise -> PeerAdvertise -> PeerAdvertise
$cmin :: PeerAdvertise -> PeerAdvertise -> PeerAdvertise
max :: PeerAdvertise -> PeerAdvertise -> PeerAdvertise
$cmax :: PeerAdvertise -> PeerAdvertise -> PeerAdvertise
>= :: PeerAdvertise -> PeerAdvertise -> Bool
$c>= :: PeerAdvertise -> PeerAdvertise -> Bool
> :: PeerAdvertise -> PeerAdvertise -> Bool
$c> :: PeerAdvertise -> PeerAdvertise -> Bool
<= :: PeerAdvertise -> PeerAdvertise -> Bool
$c<= :: PeerAdvertise -> PeerAdvertise -> Bool
< :: PeerAdvertise -> PeerAdvertise -> Bool
$c< :: PeerAdvertise -> PeerAdvertise -> Bool
compare :: PeerAdvertise -> PeerAdvertise -> Ordering
$ccompare :: PeerAdvertise -> PeerAdvertise -> Ordering
$cp1Ord :: Eq PeerAdvertise
Ord, (forall x. PeerAdvertise -> Rep PeerAdvertise x)
-> (forall x. Rep PeerAdvertise x -> PeerAdvertise)
-> Generic PeerAdvertise
forall x. Rep PeerAdvertise x -> PeerAdvertise
forall x. PeerAdvertise -> Rep PeerAdvertise x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep PeerAdvertise x -> PeerAdvertise
$cfrom :: forall x. PeerAdvertise -> Rep PeerAdvertise x
Generic)

instance FromJSON PeerAdvertise where
  parseJSON :: Value -> Parser PeerAdvertise
parseJSON = String
-> (Bool -> Parser PeerAdvertise) -> Value -> Parser PeerAdvertise
forall a. String -> (Bool -> Parser a) -> Value -> Parser a
withBool String
"PeerAdvertise" ((Bool -> Parser PeerAdvertise) -> Value -> Parser PeerAdvertise)
-> (Bool -> Parser PeerAdvertise) -> Value -> Parser PeerAdvertise
forall a b. (a -> b) -> a -> b
$
      PeerAdvertise -> Parser PeerAdvertise
forall (m :: * -> *) a. Monad m => a -> m a
return (PeerAdvertise -> Parser PeerAdvertise)
-> (Bool -> PeerAdvertise) -> Bool -> Parser PeerAdvertise
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PeerAdvertise -> PeerAdvertise -> Bool -> PeerAdvertise
forall a. a -> a -> Bool -> a
bool PeerAdvertise
DoNotAdvertisePeer PeerAdvertise
DoAdvertisePeer

instance ToJSON PeerAdvertise where
  toJSON :: PeerAdvertise -> Value
toJSON PeerAdvertise
DoAdvertisePeer    = Bool -> Value
Bool Bool
True
  toJSON PeerAdvertise
DoNotAdvertisePeer = Bool -> Value
Bool Bool
False

data PeerStatus =
       PeerCold
     | PeerWarm
     | PeerHot
  deriving (PeerStatus -> PeerStatus -> Bool
(PeerStatus -> PeerStatus -> Bool)
-> (PeerStatus -> PeerStatus -> Bool) -> Eq PeerStatus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: PeerStatus -> PeerStatus -> Bool
$c/= :: PeerStatus -> PeerStatus -> Bool
== :: PeerStatus -> PeerStatus -> Bool
$c== :: PeerStatus -> PeerStatus -> Bool
Eq, Eq PeerStatus
Eq PeerStatus
-> (PeerStatus -> PeerStatus -> Ordering)
-> (PeerStatus -> PeerStatus -> Bool)
-> (PeerStatus -> PeerStatus -> Bool)
-> (PeerStatus -> PeerStatus -> Bool)
-> (PeerStatus -> PeerStatus -> Bool)
-> (PeerStatus -> PeerStatus -> PeerStatus)
-> (PeerStatus -> PeerStatus -> PeerStatus)
-> Ord PeerStatus
PeerStatus -> PeerStatus -> Bool
PeerStatus -> PeerStatus -> Ordering
PeerStatus -> PeerStatus -> PeerStatus
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: PeerStatus -> PeerStatus -> PeerStatus
$cmin :: PeerStatus -> PeerStatus -> PeerStatus
max :: PeerStatus -> PeerStatus -> PeerStatus
$cmax :: PeerStatus -> PeerStatus -> PeerStatus
>= :: PeerStatus -> PeerStatus -> Bool
$c>= :: PeerStatus -> PeerStatus -> Bool
> :: PeerStatus -> PeerStatus -> Bool
$c> :: PeerStatus -> PeerStatus -> Bool
<= :: PeerStatus -> PeerStatus -> Bool
$c<= :: PeerStatus -> PeerStatus -> Bool
< :: PeerStatus -> PeerStatus -> Bool
$c< :: PeerStatus -> PeerStatus -> Bool
compare :: PeerStatus -> PeerStatus -> Ordering
$ccompare :: PeerStatus -> PeerStatus -> Ordering
$cp1Ord :: Eq PeerStatus
Ord, Int -> PeerStatus -> ShowS
[PeerStatus] -> ShowS
PeerStatus -> String
(Int -> PeerStatus -> ShowS)
-> (PeerStatus -> String)
-> ([PeerStatus] -> ShowS)
-> Show PeerStatus
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [PeerStatus] -> ShowS
$cshowList :: [PeerStatus] -> ShowS
show :: PeerStatus -> String
$cshow :: PeerStatus -> String
showsPrec :: Int -> PeerStatus -> ShowS
$cshowsPrec :: Int -> PeerStatus -> ShowS
Show)