@@ -1,3 +1,4 @@
1+{-# LANGUAGE AllowAmbiguousTypes #-}
12{-# LANGUAGE ConstraintKinds #-}
23{-# LANGUAGE DataKinds #-}
34{-# LANGUAGE FlexibleContexts #-}
@@ -134,7 +135,7 @@ import qualified Data.Text.Encoding as TE
134135import Data.Type.Bool
135136 (If)
136137import GHC.TypeLits
137− (KnownSymbol, symbolVal)
138+ (KnownSymbol, TypeError, symbolVal)
138139import Network.URI
139140 (URI (..), escapeURIString, isUnreserved)
140141import Prelude ()
@@ -175,6 +176,7 @@ import Servant.API.Stream
175176 (Stream, StreamBody')
176177import Servant.API.Sub
177178 (type (:>))
179+import Servant.API.TypeErrors
178180import Servant.API.TypeLevel
179181import Servant.API.UVerb
180182import Servant.API.Vault
@@ -608,3 +610,14 @@ simpleToLink _ toA _ = toLink toA (Proxy :: Proxy sub)
608610-- $setup
609611-- >>> import Servant.API
610612-- >>> import Data.Text (Text)
613+
614+-- Erroring instance for 'HasLink' when a combinator is not fully applied
615+instance TypeError (PartialApplication HasLink arr) => HasLink ((arr :: a -> b) :> sub)
616+ where
617+ type MkLink (arr :> _) _ = TypeError (PartialApplication HasLink arr)
618+ toLink = error "unreachable"
619+
620+-- Erroring instances for 'HasLink' for unknown API combinators
621+instance {-# OVERLAPPABLE #-} TypeError (NoInstanceForSub HasLink ty) => HasLink (ty :> sub)
622+
623+instance {-# OVERLAPPABLE #-} TypeError (NoInstanceFor (HasLink api)) => HasLink api