hls-plugin-api-2.9.0.0: Haskell Language Server API for plugin communication
Safe HaskellSafe-Inferred
LanguageGHC2021

Ide.Plugin.Properties

Synopsis

Documentation

data PropertyType Source #

Types properties may have

Constructors

TNumber 
TInteger 
TString 
TBoolean 
TObject Type 
TArray Type 
TEnum Type 
TProperties [PropertyKey]

A typed TObject, defined in a recursive manner

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

type family NotElem (s :: Symbol) (r :: [PropertyKey]) :: Constraint where ... Source #

Equations

NotElem s ('PropertyKey s _ ': _) = TypeError (('Text "The key \8216" ':<>: 'Text s) ':<>: 'Text "\8217 is already defined") 
NotElem s (_ ': xs) = NotElem s xs 
NotElem s '[] = () 

data MetaData (t :: PropertyType) where Source #

Metadata of a property

Constructors

MetaData 

Fields

EnumMetaData 

Fields

PropertiesMetaData 

Fields

data PropertyKey Source #

Used at type level for name-type mapping in Properties

data KeyNameProxy (s :: Symbol) Source #

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') Source # 
Instance details

Defined in Ide.Plugin.Properties

Methods

fromLabel :: KeyNameProxy s' #

data KeyNamePath (r :: NonEmptyList Symbol) where Source #

a path to a property in a json object

Constructors

SingleKey :: KeyNameProxy s -> KeyNamePath (NE s) 
ConsKeysPath :: KeyNameProxy s1 -> KeyNamePath ss -> KeyNamePath (s1 :| ss) 

data Properties (r :: [PropertyKey]) Source #

Properties is a partial implementation of json schema, without supporting union types and validation. In hls, it defines a set of properties 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, FindByKeyPath (NE s) r ~ t, FindByKeyName s r ~ t, KnownSymbol s, FindPropertyMeta s r t) Source #

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

type HasPropertyByPath props path t = (t ~ FindByKeyPath path props, ParsePropertyPath props path) Source #

emptyProperties :: Properties '[] Source #

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 Source #

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 Source #

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 Source #

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 Source #

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 Source #

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 Source #

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 Source #

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

definePropertiesProperty :: (KnownSymbol s, NotElem s r) => KeyNameProxy s -> Text -> Properties childrenProps -> Properties r -> Properties ('PropertyKey s ('TProperties childrenProps) : r) Source #

toDefaultJSON :: Properties r -> [Pair] Source #

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

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

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) Source #

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 Source #

Like usePropertyEither but returns defaultValue on parse error

usePropertyByPathEither :: ParsePropertyPath rs r => KeyNamePath r -> Properties rs -> Object -> Either String (ToHsType (FindByKeyPath r rs)) Source #

usePropertyByPath :: ParsePropertyPath rs r => KeyNamePath r -> Properties rs -> Object -> ToHsType (FindByKeyPath r rs) Source #

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

& is a reverse application operator. This provides notational convenience. Its precedence is one higher than that of the forward application operator $, which allows & to be nested in $.

>>> 5 & (+1) & show
"6"

Since: base-4.8.0.0