@@ -28,6 +28,7 @@ module Ide.Plugin.Properties
28
28
HasProperty ,
29
29
emptyProperties ,
30
30
defineNumberProperty ,
31
+ defineIntegerProperty ,
31
32
defineStringProperty ,
32
33
defineBooleanProperty ,
33
34
defineObjectProperty ,
@@ -55,14 +56,16 @@ import Unsafe.Coerce (unsafeCoerce)
55
56
-- | Types properties may have
56
57
data PropertyType
57
58
= TNumber
59
+ | TInteger
58
60
| TString
59
61
| TBoolean
60
62
| TObject
61
63
| TArray
62
64
| TEnum
63
65
64
66
type family ToHsType (t :: PropertyType ) where
65
- ToHsType 'TNumber = Int
67
+ ToHsType 'TNumber = Double -- in js, there are no distinct types for integers and floating-point values
68
+ ToHsType 'TInteger = Int -- so here we use Double for Number, Int for Integer
66
69
ToHsType 'TString = T. Text
67
70
ToHsType 'TBoolean = Bool
68
71
ToHsType 'TObject = A. Object
@@ -94,6 +97,7 @@ data PropertyKey = PropertyKey Symbol PropertyType
94
97
-- | Singleton type of 'PropertyKey'
95
98
data SPropertyKey (k :: PropertyKey ) where
96
99
SNumber :: SPropertyKey ('PropertyKey s 'TNumber)
100
+ SInteger :: SPropertyKey ('PropertyKey s 'TInteger)
97
101
SString :: SPropertyKey ('PropertyKey s 'TString)
98
102
SBoolean :: SPropertyKey ('PropertyKey s 'TBoolean)
99
103
SObject :: SPropertyKey ('PropertyKey s 'TObject)
@@ -106,7 +110,8 @@ data SomePropertyKeyWithMetaData
106
110
(k ~ 'PropertyKey s t ) =>
107
111
SomePropertyKeyWithMetaData (SPropertyKey k ) (MetaData t )
108
112
109
- -- | 'Properties' defines a set of properties which used in dedicated configuration of a plugin.
113
+ -- | 'Properties' is a partial implementation of json schema, without supporting union types and validation.
114
+ -- In hls, it defines a set of properties which used in dedicated configuration of a plugin.
110
115
-- A property is an immediate child of the json object in each plugin's "config" section.
111
116
-- It was designed to be compatible with vscode's settings UI.
112
117
-- Use 'emptyProperties' and 'useProperty' to create and consume 'Properties'.
@@ -202,7 +207,7 @@ usePropertyEither ::
202
207
Properties r ->
203
208
A. Object ->
204
209
Either String (ToHsType t )
205
- usePropertyEither k p = parseProperty k (find k p)
210
+ usePropertyEither kn p = parseProperty kn (find k p)
206
211
207
212
-- | Like 'usePropertyEither' but returns 'defaultValue' on parse error
208
213
useProperty ::
@@ -211,21 +216,22 @@ useProperty ::
211
216
Properties r ->
212
217
Maybe A. Object ->
213
218
ToHsType t
214
- useProperty k p =
219
+ useProperty kn p =
215
220
maybe
216
221
(defaultValue metadata)
217
- (fromRight (defaultValue metadata) . usePropertyEither k p)
222
+ (fromRight (defaultValue metadata) . usePropertyEither kn p)
218
223
where
219
- (_, metadata) = find k p
224
+ (_, metadata) = find kn p
220
225
221
226
parseProperty ::
222
227
(k ~ 'PropertyKey s t , KnownSymbol s ) =>
223
228
KeyNameProxy s ->
224
229
(SPropertyKey k , MetaData t ) ->
225
230
A. Object ->
226
231
Either String (ToHsType t )
227
- parseProperty k km x = case km of
232
+ parseProperty kn k x = case k of
228
233
(SNumber , _) -> parseEither
234
+ (SInteger , _) -> parseEither
229
235
(SString , _) -> parseEither
230
236
(SBoolean , _) -> parseEither
231
237
(SObject , _) -> parseEither
@@ -245,7 +251,7 @@ parseProperty k km x = case km of
245
251
)
246
252
x
247
253
where
248
- keyName = T. pack $ symbolVal k
254
+ keyName = T. pack $ symbolVal kn
249
255
parseEither :: forall a . A. FromJSON a => Either String a
250
256
parseEither = A. parseEither (A. .: keyName) x
251
257
@@ -258,12 +264,25 @@ defineNumberProperty ::
258
264
-- | description
259
265
T. Text ->
260
266
-- | default value
261
- Int ->
267
+ Double ->
262
268
Properties r ->
263
269
Properties ('PropertyKey s 'TNumber : r )
264
270
defineNumberProperty kn description defaultValue =
265
271
insert kn SNumber MetaData {.. }
266
272
273
+ -- | Defines an integer property
274
+ defineIntegerProperty ::
275
+ (KnownSymbol s , NotElem s r ) =>
276
+ KeyNameProxy s ->
277
+ -- | description
278
+ T. Text ->
279
+ -- | default value
280
+ Int ->
281
+ Properties r ->
282
+ Properties ('PropertyKey s 'TInteger : r )
283
+ defineIntegerProperty kn description defaultValue =
284
+ insert kn SInteger MetaData {.. }
285
+
267
286
-- | Defines a string property
268
287
defineStringProperty ::
269
288
(KnownSymbol s , NotElem s r ) =>
@@ -341,6 +360,8 @@ toDefaultJSON (Properties p) = [toEntry s v | (s, v) <- Map.toList p]
341
360
toEntry (T. pack -> s) = \ case
342
361
(SomePropertyKeyWithMetaData SNumber MetaData {.. }) ->
343
362
s A. .= defaultValue
363
+ (SomePropertyKeyWithMetaData SInteger MetaData {.. }) ->
364
+ s A. .= defaultValue
344
365
(SomePropertyKeyWithMetaData SString MetaData {.. }) ->
345
366
s A. .= defaultValue
346
367
(SomePropertyKeyWithMetaData SBoolean MetaData {.. }) ->
@@ -366,6 +387,13 @@ toVSCodeExtensionSchema prefix (Properties p) =
366
387
" default" A. .= defaultValue,
367
388
" scope" A. .= A. String " resource"
368
389
]
390
+ (SomePropertyKeyWithMetaData SInteger MetaData {.. }) ->
391
+ A. object
392
+ [ " type" A. .= A. String " integer" ,
393
+ " markdownDescription" A. .= description,
394
+ " default" A. .= defaultValue,
395
+ " scope" A. .= A. String " resource"
396
+ ]
369
397
(SomePropertyKeyWithMetaData SString MetaData {.. }) ->
370
398
A. object
371
399
[ " type" A. .= A. String " string" ,
0 commit comments