module Main where import qualified Data.Set as Set import MiniAccessPolicy.Policy ( ApprovalReport (ApprovalReport) , Environment (Production, Staging) , accessMatrix , buildApprovalReport , ownershipIndex , parseRequest , renderReport ) import System.Exit (die) main :: IO () main = case ( parseRequest "api:production:platform,security" , parseRequest "frontend:production:frontend,platform" ) of ( Right allowedRequest , Right deniedRequest ) -> case ( buildApprovalReport ownershipIndex accessMatrix allowedRequest , buildApprovalReport ownershipIndex accessMatrix deniedRequest ) of ( Right allowedReport@(ApprovalReport "api" Production required supplied missing unexpected True) , Right deniedReport@(ApprovalReport "frontend" Production _ _ _ deniedUnexpected False) ) | required == Set.fromList ["platform", "security"] && missing == Set.empty && unexpected == Set.empty && deniedUnexpected == Set.fromList ["frontend"] && renderReport deniedReport == "frontend -> production, required platform, supplied frontend/platform, missing none, unexpected frontend, allowed no" -> putStrLn "test passed" _ -> die "unexpected Map/Set modeling result" _ -> die "unexpected access policy parse result"