module Propellor.Types.Result where

import System.Console.ANSI
import qualified Data.Semigroup as Sem
import Data.Monoid
import Prelude

-- | There can be three results of satisfying a Property.
data Result = NoChange | MadeChange | FailedChange
        deriving (Read, Show, Eq)

instance Sem.Semigroup Result where
        FailedChange <> _ = FailedChange
        _ <> FailedChange = FailedChange
        MadeChange <> _ = MadeChange
        _ <> MadeChange = MadeChange
        NoChange <> NoChange = NoChange

instance Monoid Result where
        mempty = NoChange
        mappend = (Sem.<>)

class ToResult t where
        toResult :: t -> Result

instance ToResult Bool where
        toResult False = FailedChange
        toResult True = MadeChange

instance ToResult Result where
        toResult = id

-- | Results of actions, with color.
class ActionResult a where
        getActionResult :: a -> (String, ColorIntensity, Color)

instance ActionResult Bool where
        getActionResult False = ("failed", Vivid, Red)
        getActionResult True = ("done", Dull, Green)

instance ActionResult Result where
        getActionResult NoChange = ("ok", Dull, Green)
        getActionResult MadeChange = ("done", Vivid, Green)
        getActionResult FailedChange = ("failed", Vivid, Red)