{-# LANGUAGE TemplateHaskell            #-}
module Language.Haskell.LSP.Types.DocumentFilter where

import           Data.Aeson.TH
import           Data.Text                      ( Text )
import           Language.Haskell.LSP.Types.Constants
import           Language.Haskell.LSP.Types.List

-- ---------------------------------------------------------------------
{-
New in 3.0
----------

DocumentFilter
https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#new-documentfilter

A document filter denotes a document through properties like language, schema or
pattern. Examples are a filter that applies to TypeScript files on disk or a
filter the applies to JSON files with name package.json:

    { language: 'typescript', scheme: 'file' }
    { language: 'json', pattern: '**/package.json' }

export interface DocumentFilter {
        /**
         * A language id, like `typescript`.
         */
        language?: string;

        /**
         * A Uri [scheme](#Uri.scheme), like `file` or `untitled`.
         */
        scheme?: string;

        /**
         * A glob pattern, like `*.{ts,js}`.
         */
        pattern?: string;
}
-}
data DocumentFilter =
  DocumentFilter
    { DocumentFilter -> Maybe Text
_language :: Maybe Text
    , DocumentFilter -> Maybe Text
_scheme   :: Maybe Text
    , DocumentFilter -> Maybe Text
_pattern  :: Maybe Text
    } deriving (Int -> DocumentFilter -> ShowS
[DocumentFilter] -> ShowS
DocumentFilter -> String
(Int -> DocumentFilter -> ShowS)
-> (DocumentFilter -> String)
-> ([DocumentFilter] -> ShowS)
-> Show DocumentFilter
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DocumentFilter] -> ShowS
$cshowList :: [DocumentFilter] -> ShowS
show :: DocumentFilter -> String
$cshow :: DocumentFilter -> String
showsPrec :: Int -> DocumentFilter -> ShowS
$cshowsPrec :: Int -> DocumentFilter -> ShowS
Show, ReadPrec [DocumentFilter]
ReadPrec DocumentFilter
Int -> ReadS DocumentFilter
ReadS [DocumentFilter]
(Int -> ReadS DocumentFilter)
-> ReadS [DocumentFilter]
-> ReadPrec DocumentFilter
-> ReadPrec [DocumentFilter]
-> Read DocumentFilter
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DocumentFilter]
$creadListPrec :: ReadPrec [DocumentFilter]
readPrec :: ReadPrec DocumentFilter
$creadPrec :: ReadPrec DocumentFilter
readList :: ReadS [DocumentFilter]
$creadList :: ReadS [DocumentFilter]
readsPrec :: Int -> ReadS DocumentFilter
$creadsPrec :: Int -> ReadS DocumentFilter
Read, DocumentFilter -> DocumentFilter -> Bool
(DocumentFilter -> DocumentFilter -> Bool)
-> (DocumentFilter -> DocumentFilter -> Bool) -> Eq DocumentFilter
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DocumentFilter -> DocumentFilter -> Bool
$c/= :: DocumentFilter -> DocumentFilter -> Bool
== :: DocumentFilter -> DocumentFilter -> Bool
$c== :: DocumentFilter -> DocumentFilter -> Bool
Eq)

deriveJSON lspOptions ''DocumentFilter

{-
A document selector is the combination of one or many document filters.

export type DocumentSelector = DocumentFilter[];
-}
type DocumentSelector = List DocumentFilter