packages feed

compaREST-0.1.0.0: src/Data/OpenApi/Compare/References.hs

{-# OPTIONS_GHC -Wno-orphans #-}

module Data.OpenApi.Compare.References
  ( Step (..),
    dereference,
    Typeable,
  )
where

import Data.HList
import qualified Data.HashMap.Strict.InsOrd as IOHM
import Data.Maybe
import Data.OpenApi
import Data.OpenApi.Compare.Orphans ()
import Data.OpenApi.Compare.Subtree

instance Typeable a => Steppable (Referenced a) a where
  data Step (Referenced a) a = InlineStep
    deriving stock (Eq, Ord, Show)

dereference ::
  Typeable a =>
  Traced (Definitions a) ->
  Traced (Referenced a) ->
  Traced a
dereference defs x = case extract x of
  Inline a ->
    traced (ask x >>> step InlineStep) a
  Ref (Reference ref) ->
    traced (ask defs >>> step (InsOrdHashMapKeyStep ref)) (fromJust $ IOHM.lookup ref $ extract defs)

instance Subtree a => Subtree (Referenced a) where
  type CheckEnv (Referenced a) = ProdCons (Traced (Definitions a)) ': CheckEnv a
  type SubtreeLevel (Referenced a) = SubtreeLevel a

  checkStructuralCompatibility (defs `HCons` env) pc' = do
    let pc = do
          x <- pc'
          defs' <- defs
          pure (dereference defs' x)
    checkSubstructure env pc

  checkSemanticCompatibility (defs `HCons` env) bhv pc' = do
    let pc = do
          x <- pc'
          defs' <- defs
          pure (dereference defs' x)
    checkCompatibility bhv env pc