module Data.OpenApi.Compare.Run
  ( runChecker,
    runReport,
    module Data.OpenApi.Compare.Report,
  )
where

import Data.HList
import Data.OpenApi (OpenApi)
import Data.OpenApi.Compare.Paths
import Data.OpenApi.Compare.Report
import Data.OpenApi.Compare.Subtree
import Data.OpenApi.Compare.Validate.OpenApi ()
import Text.Pandoc.Builder

runChecker :: (OpenApi, OpenApi) -> CheckerOutput
runChecker :: (OpenApi, OpenApi) -> CheckerOutput
runChecker (OpenApi
client, OpenApi
server) =
  CheckerOutput :: Changes -> Changes -> CheckerOutput
CheckerOutput
    { $sel:forwardChanges:CheckerOutput :: Changes
forwardChanges = OpenApi -> OpenApi -> Changes
run OpenApi
client OpenApi
server
    , $sel:backwardChanges:CheckerOutput :: Changes
backwardChanges = OpenApi -> OpenApi -> Changes
run OpenApi
server OpenApi
client
    }
  where
    toPC :: OpenApi -> OpenApi -> ProdCons (Traced OpenApi)
toPC OpenApi
p OpenApi
c =
      ProdCons :: forall a. a -> a -> ProdCons a
ProdCons
        { $sel:producer:ProdCons :: Traced OpenApi
producer = Trace OpenApi -> OpenApi -> Traced OpenApi
forall a. Trace a -> a -> Traced a
traced (Step TraceRoot OpenApi -> Trace OpenApi
forall k (q :: k -> k -> *) (a :: k) (b :: k).
NiceQuiver q a b =>
q a b -> Paths q a b
step Step TraceRoot OpenApi
ClientSchema) OpenApi
p
        , $sel:consumer:ProdCons :: Traced OpenApi
consumer = Trace OpenApi -> OpenApi -> Traced OpenApi
forall a. Trace a -> a -> Traced a
traced (Step TraceRoot OpenApi -> Trace OpenApi
forall k (q :: k -> k -> *) (a :: k) (b :: k).
NiceQuiver q a b =>
q a b -> Paths q a b
step Step TraceRoot OpenApi
ServerSchema) OpenApi
c
        }
    run :: OpenApi -> OpenApi -> Changes
run OpenApi
p OpenApi
c = (Changes -> Changes)
-> (() -> Changes) -> Either Changes () -> Changes
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Changes -> Changes
forall a. a -> a
id () -> Changes
forall a. Monoid a => a
mempty (Either Changes () -> Changes)
-> (ProdCons (Traced OpenApi) -> Either Changes ())
-> ProdCons (Traced OpenApi)
-> Changes
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CompatFormula' Behave AnIssue 'APILevel () -> Either Changes ()
forall k (q :: k -> k -> *) (f :: k -> *) (r :: k) a.
CompatFormula' q f r a -> Either (PathsPrefixTree q f r) a
runCompatFormula (CompatFormula' Behave AnIssue 'APILevel () -> Either Changes ())
-> (ProdCons (Traced OpenApi)
    -> CompatFormula' Behave AnIssue 'APILevel ())
-> ProdCons (Traced OpenApi)
-> Either Changes ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Behavior (SubtreeLevel OpenApi)
-> HList '[]
-> ProdCons (Traced OpenApi)
-> CompatFormula' Behave AnIssue 'APILevel ()
forall t (xs :: [*]).
(ReassembleHList xs (CheckEnv t), Subtree t) =>
Behavior (SubtreeLevel t)
-> HList xs
-> ProdCons (Traced t)
-> CompatFormula' Behave AnIssue 'APILevel ()
checkCompatibility Behavior (SubtreeLevel OpenApi)
forall k (q :: k -> k -> *) (a :: k). Paths q a a
Root HList '[]
HNil (ProdCons (Traced OpenApi) -> Changes)
-> ProdCons (Traced OpenApi) -> Changes
forall a b. (a -> b) -> a -> b
$ OpenApi -> OpenApi -> ProdCons (Traced OpenApi)
toPC OpenApi
p OpenApi
c

runReport :: ReportConfig -> (OpenApi, OpenApi) -> (Blocks, ReportStatus)
runReport :: ReportConfig -> (OpenApi, OpenApi) -> (Blocks, ReportStatus)
runReport ReportConfig
cfg = ReportConfig -> ReportInput -> (Blocks, ReportStatus)
generateReport ReportConfig
cfg (ReportInput -> (Blocks, ReportStatus))
-> ((OpenApi, OpenApi) -> ReportInput)
-> (OpenApi, OpenApi)
-> (Blocks, ReportStatus)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CheckerOutput -> ReportInput
segregateIssues (CheckerOutput -> ReportInput)
-> ((OpenApi, OpenApi) -> CheckerOutput)
-> (OpenApi, OpenApi)
-> ReportInput
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (OpenApi, OpenApi) -> CheckerOutput
runChecker