{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NoFieldSelectors #-}

module Okapi.Record.Result where

import Okapi.Tree (Failure)
import Okapi.HTTP.Request.Method (Method)
import Okapi.HTTP.Request.Path (Path)
import Okapi.HTTP.Request.Query (Query)
import Okapi.HTTP.Request.Headers qualified as Request (Headers)
import Okapi.HTTP.Request.Body qualified as Request (Body)
import Okapi.HTTP.Response.Status (Status)
import Okapi.HTTP.Response.Headers qualified as Response (Headers)
import Okapi.HTTP.Response.Body qualified as Response (Body)

data Request method path query headers body = Request
    { forall method path query headers body.
Request method path query headers body
-> Either (Failure Method) method
method  :: Either (Failure Method) method
    , forall method path query headers body.
Request method path query headers body
-> Either (Failure Path) path
path    :: Either (Failure Path) path
    , forall method path query headers body.
Request method path query headers body
-> Either (Failure Query) query
query   :: Either (Failure Query) query
    , forall method path query headers body.
Request method path query headers body
-> Either (Failure Headers) headers
headers :: Either (Failure Request.Headers) headers
    , forall method path query headers body.
Request method path query headers body
-> Either (Failure Body) body
body    :: Either (Failure Request.Body) body
    }

data Response status headers body = Response
    { forall status headers body.
Response status headers body -> Either (Failure Status) status
status  :: Either (Failure Status) status
    , forall status headers body.
Response status headers body -> Either (Failure Headers) headers
headers :: Either (Failure Response.Headers) headers
    , forall status headers body.
Response status headers body -> Either (Failure Body) body
body    :: Either (Failure Response.Body) body
    }