packages feed

compaREST-0.1.0.0: src/Data/OpenApi/Compare/Validate/SecurityScheme.hs

{-# OPTIONS_GHC -Wno-orphans #-}

module Data.OpenApi.Compare.Validate.SecurityScheme
  (
  )
where

import Control.Monad
import Data.OpenApi
import Data.OpenApi.Compare.Behavior
import Data.OpenApi.Compare.Orphans ()
import Data.OpenApi.Compare.Subtree
import Data.OpenApi.Compare.Validate.OAuth2Flows

instance Subtree SecurityScheme where
  type CheckEnv SecurityScheme = '[]
  type SubtreeLevel SecurityScheme = 'SecuritySchemeLevel
  checkStructuralCompatibility _ pc = structuralEq $ tracedSecuritySchemaTypes <$> pc
  checkSemanticCompatibility env bhv pcSecScheme = case tracedSecuritySchemaTypes <$> pcSecScheme of
    (ProdCons (Traced _ (SecuritySchemeHttp pType)) (Traced _ (SecuritySchemeHttp cType))) -> case (pType, cType) of
      (HttpSchemeBearer _, HttpSchemeBearer _) -> pure ()
      (HttpSchemeBasic, HttpSchemeBasic) -> pure ()
      (HttpSchemeCustom p, HttpSchemeCustom c) ->
        unless (p == c) (issueAt bhv $ CustomHttpSchemesDontMatch p c)
      _ -> issueAt bhv $ HttpSchemeTypesDontMatch pType cType
    (ProdCons (Traced _ (SecuritySchemeApiKey pParams)) (Traced _ (SecuritySchemeApiKey cParams))) -> do
      unless (pParams == cParams) (issueAt bhv $ ApiKeyParamsDontMatch pParams cParams)
    (ProdCons (Traced pT (SecuritySchemeOAuth2 pFlows)) (Traced cT (SecuritySchemeOAuth2 cFlows))) -> do
      checkCompatibility bhv env . fmap (stepTraced SecurityOAuthFlowsStep) $ ProdCons (Traced pT pFlows) (Traced cT cFlows)
    (ProdCons (Traced _ (SecuritySchemeOpenIdConnect pUrl)) (Traced _ (SecuritySchemeOpenIdConnect cUrl))) -> do
      unless (pUrl == cUrl) (issueAt bhv $ OpenIdConnectUrlsDontMatch pUrl cUrl)
    _ -> issueAt bhv DifferentSecuritySchemes

tracedSecuritySchemaTypes :: Traced SecurityScheme -> Traced SecuritySchemeType
tracedSecuritySchemaTypes (Traced t x) = Traced (t >>> step SecuritySchemeTypeStep) (_securitySchemeType x)

instance Steppable SecurityScheme SecuritySchemeType where
  data Step SecurityScheme SecuritySchemeType = SecuritySchemeTypeStep
    deriving stock (Eq, Ord, Show)

instance Steppable SecuritySchemeType OAuth2Flows where
  data Step SecuritySchemeType OAuth2Flows = SecurityOAuthFlowsStep
    deriving stock (Eq, Ord, Show)