hls-plugin-api-2.4.0.0: Haskell Language Server API for plugin communication

Safe Haskell | Safe-Inferred
Language | Haskell2010

Ide.Plugin.Properties

Synopsis

- data PropertyType
  - = TNumber
  - | TInteger
  - | TString
  - | TBoolean
  - | TObject Type
  - | TArray Type
  - | TEnum Type
- type family ToHsType (t :: PropertyType) where ...
- data MetaData (t :: PropertyType) where
  - MetaData :: IsTEnum t ~ 'False => {..} -> MetaData t
  - EnumMetaData :: IsTEnum t ~ 'True => {..} -> MetaData t
- data PropertyKey = PropertyKey Symbol PropertyType
- data SPropertyKey (k :: PropertyKey) where
  - SNumber :: SPropertyKey ('PropertyKey s 'TNumber)
  - SInteger :: SPropertyKey ('PropertyKey s 'TInteger)
  - SString :: SPropertyKey ('PropertyKey s 'TString)
  - SBoolean :: SPropertyKey ('PropertyKey s 'TBoolean)
  - SObject :: (ToJSON a, FromJSON a) => Proxy a -> SPropertyKey ('PropertyKey s ('TObject a))
  - SArray :: (ToJSON a, FromJSON a) => Proxy a -> SPropertyKey ('PropertyKey s ('TArray a))
  - SEnum :: (ToJSON a, FromJSON a, Eq a, Show a) => Proxy a -> SPropertyKey ('PropertyKey s ('TEnum a))
- data KeyNameProxy (s :: Symbol) = KnownSymbol s => KeyNameProxy
- data Properties (r :: [PropertyKey])
- type HasProperty s k t r = (k ~ 'PropertyKey s t, Elem s r, FindByKeyName s r ~ t, KnownSymbol s)
- emptyProperties :: Properties '[]
- defineNumberProperty :: (KnownSymbol s, NotElem s r) => KeyNameProxy s -> Text -> Double -> Properties r -> Properties ('PropertyKey s 'TNumber : r)
- defineIntegerProperty :: (KnownSymbol s, NotElem s r) => KeyNameProxy s -> Text -> Int -> Properties r -> Properties ('PropertyKey s 'TInteger : r)
- defineStringProperty :: (KnownSymbol s, NotElem s r) => KeyNameProxy s -> Text -> Text -> Properties r -> Properties ('PropertyKey s 'TString : r)
- defineBooleanProperty :: (KnownSymbol s, NotElem s r) => KeyNameProxy s -> Text -> Bool -> Properties r -> Properties ('PropertyKey s 'TBoolean : r)
- defineObjectProperty :: (KnownSymbol s, NotElem s r, ToJSON a, FromJSON a) => KeyNameProxy s -> Text -> a -> Properties r -> Properties ('PropertyKey s ('TObject a) : r)
- defineArrayProperty :: (KnownSymbol s, NotElem s r, ToJSON a, FromJSON a) => KeyNameProxy s -> Text -> [a] -> Properties r -> Properties ('PropertyKey s ('TArray a) : r)
- defineEnumProperty :: (KnownSymbol s, NotElem s r, ToJSON a, FromJSON a, Eq a, Show a) => KeyNameProxy s -> Text -> [(a, Text)] -> a -> Properties r -> Properties ('PropertyKey s ('TEnum a) : r)
- toDefaultJSON :: Properties r -> [Pair]
- toVSCodeExtensionSchema :: Text -> Properties r -> [Pair]
- usePropertyEither :: HasProperty s k t r => KeyNameProxy s -> Properties r -> Object -> Either String (ToHsType t)
- useProperty :: HasProperty s k t r => KeyNameProxy s -> Properties r -> Object -> ToHsType t
- (&) :: a -> (a -> b) -> b

# Documentation

data PropertyType #

Types properties may have

Constructors

TNumber |
TInteger |
TString |
TBoolean |
TObject Type |
TArray Type |
TEnum Type |

type family ToHsType (t :: PropertyType) where ... #

Equations

ToHsType 'TNumber = Double |
ToHsType 'TInteger = Int |
ToHsType 'TString = Text |
ToHsType 'TBoolean = Bool |
ToHsType ('TObject a) = a |
ToHsType ('TArray a) = [a] |
ToHsType ('TEnum a) = a |

data MetaData (t :: PropertyType) where #

Metadata of a property

Constructors

MetaData |
Fields :: IsTEnum t ~ 'False => { defaultValue :: ToHsType t , description :: Text } -> MetaData t
EnumMetaData |
Fields :: IsTEnum t ~ 'True => { defaultValue :: ToHsType t , description :: Text , enumValues :: [ToHsType t] , enumDescriptions :: [Text] } -> MetaData t

data PropertyKey #

Used at type level for name-type mapping in `Properties`

Constructors

PropertyKey Symbol PropertyType |

data SPropertyKey (k :: PropertyKey) where #

Singleton type of `PropertyKey`

Constructors

SNumber :: SPropertyKey ('PropertyKey s 'TNumber) |
SInteger :: SPropertyKey ('PropertyKey s 'TInteger) |
SString :: SPropertyKey ('PropertyKey s 'TString) |
SBoolean :: SPropertyKey ('PropertyKey s 'TBoolean) |
SObject :: (ToJSON a, FromJSON a) => Proxy a -> SPropertyKey ('PropertyKey s ('TObject a)) |
SArray :: (ToJSON a, FromJSON a) => Proxy a -> SPropertyKey ('PropertyKey s ('TArray a)) |
SEnum :: (ToJSON a, FromJSON a, Eq a, Show a) => Proxy a -> SPropertyKey ('PropertyKey s ('TEnum a)) |

data KeyNameProxy (s :: Symbol) #

A proxy type in order to allow overloaded labels as properties' names at the call site

Constructors

KnownSymbol s => KeyNameProxy |

#### Instances

Instances details

(KnownSymbol s', s ~ s') => IsLabel s (KeyNameProxy s') # |
Instance details Defined in Ide.Plugin.Properties Methods fromLabel :: KeyNameProxy s'

data Properties (r :: [PropertyKey]) #

`Properties` is a partial implementation of json schema, without supporting union types and validation. In hls, it defines a set of properties which used in dedicated configuration of a plugin. A property is an immediate child of the json object in each plugin's "config" section. It was designed to be compatible with vscode's settings UI. Use `emptyProperties` and `useProperty` to create and consume `Properties`.

type HasProperty s k t r = (k ~ 'PropertyKey s t, Elem s r, FindByKeyName s r ~ t, KnownSymbol s) #

In row `r`, there is a `PropertyKey` `k`, which has name `s` and carries haskell type `t`

emptyProperties :: Properties '[] #

Creates a `Properties` that defines no property

Useful to start a definitions chain, for example: `properties = emptyProperties & defineStringProperty #exampleString "Description of exampleString" Foo & defineNumberProperty #exampleNumber "Description of exampleNumber" 233`

defineNumberProperty #

Arguments

:: (KnownSymbol s, NotElem s r) |
=> KeyNameProxy s |
-> Text | description
-> Double | default value
-> Properties r |
-> Properties ('PropertyKey s 'TNumber : r) |

Defines a number property

defineIntegerProperty #

Arguments

:: (KnownSymbol s, NotElem s r) |
=> KeyNameProxy s |
-> Text | description
-> Int | default value
-> Properties r |
-> Properties ('PropertyKey s 'TInteger : r) |

Defines an integer property

defineStringProperty #

Arguments

:: (KnownSymbol s, NotElem s r) |
=> KeyNameProxy s |
-> Text | description
-> Text | default value
-> Properties r |
-> Properties ('PropertyKey s 'TString : r) |

Defines a string property

defineBooleanProperty #

Arguments

:: (KnownSymbol s, NotElem s r) |
=> KeyNameProxy s |
-> Text | description
-> Bool | default value
-> Properties r |
-> Properties ('PropertyKey s 'TBoolean : r) |

Defines a boolean property

defineObjectProperty #

Arguments

:: (KnownSymbol s, NotElem s r, ToJSON a, FromJSON a) |
=> KeyNameProxy s |
-> Text | description
-> a | default value
-> Properties r |
-> Properties ('PropertyKey s ('TObject a) : r) |

Defines an object property

defineArrayProperty #

Arguments

:: (KnownSymbol s, NotElem s r, ToJSON a, FromJSON a) |
=> KeyNameProxy s |
-> Text | description
-> [a] | default value
-> Properties r |
-> Properties ('PropertyKey s ('TArray a) : r) |

Defines an array property

defineEnumProperty #

Arguments

:: (KnownSymbol s, NotElem s r, ToJSON a, FromJSON a, Eq a, Show a) |
=> KeyNameProxy s |
-> Text | description
-> [(a, Text)] | valid enum members with each of description
-> a |
-> Properties r |
-> Properties ('PropertyKey s ('TEnum a) : r) |

Defines an enum property

toDefaultJSON :: Properties r -> [Pair] #

Converts a properties definition into kv pairs with default values from `MetaData`

toVSCodeExtensionSchema :: Text -> Properties r -> [Pair] #

Converts a properties definition into kv pairs as vscode schema

usePropertyEither :: HasProperty s k t r => KeyNameProxy s -> Properties r -> Object -> Either String (ToHsType t) #

Given the name of a defined property, generates a JSON parser of `plcConfig`

useProperty :: HasProperty s k t r => KeyNameProxy s -> Properties r -> Object -> ToHsType t #

Like `usePropertyEither` but returns `defaultValue` on parse error

(&) :: a -> (a -> b) -> b #