module Propellor.Engine where

import System.Exit
import System.IO
import Data.Monoid
import System.Console.ANSI

import Propellor.Types
import Propellor.Message
import Utility.Exception

ensureProperty :: Property -> IO Result
ensureProperty = catchDefaultIO FailedChange . propertySatisfy

ensureProperties :: [Property] -> IO ()
ensureProperties ps = do
	r <- ensureProperties' [Property "overall" $ ensureProperties' ps]
	setTitle "propellor: done"
	hFlush stdout
	case r of
		FailedChange -> exitWith (ExitFailure 1)
		_ -> exitWith ExitSuccess

ensureProperties' :: [Property] -> IO Result
ensureProperties' ps = ensure ps NoChange
  where
	ensure [] rs = return rs
	ensure (l:ls) rs = do
		r <- actionMessage (propertyDesc l) (ensureProperty l)
		ensure ls (r <> rs)