Skip to content

Commit d1bb5e6

Browse files
authored
Merge pull request #931 from jwest115/fix/dict-struct-defaults
Fix dictionary JSON struct default values
2 parents 3b32425 + 519b3ef commit d1bb5e6

File tree

9 files changed

+211
-156
lines changed

9 files changed

+211
-156
lines changed

compiler/lib/src/main/scala/codegen/DictionaryJsonWriter/DictionaryJsonEncoder.scala

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -169,17 +169,22 @@ case class DictionaryJsonEncoder(
169169

170170
/** JSON Encoding for arrays */
171171
def arrayElementsAsJson(elements: List[Value]): Json = {
172-
val arrayRes = for(e <- elements) yield {
173-
val res = e match {
174-
// Case where array is N-dimensional
175-
case Value.Array(a, t) => arrayElementsAsJson(a.elements)
176-
case _ => valueAsJson(e)
177-
}
178-
179-
res.asJson
180-
}
172+
val arrayRes = for(e <- elements) yield valueAsJson(e)
181173
arrayRes.asJson
182174
}
175+
176+
/** JSON Encoding for struct values */
177+
def structValueAsJson(value: Value.Struct): Json = {
178+
val Value.Struct(Value.AnonStruct(members), t) = value
179+
val Type.Struct(_, _, _, sizes, _) = dictionaryState.a.typeMap(t.node._2.id)
180+
members.map((key, v) =>
181+
val valueJson = valueAsJson(v)
182+
sizes.get(key) match
183+
case Some(size) =>
184+
(key.toString -> Json.fromValues(List.fill(size)(valueJson)))
185+
case None => (key.toString -> valueJson)
186+
).asJson
187+
}
183188

184189
/** JSON Encoding for FPP Values
185190
*
@@ -197,7 +202,7 @@ case class DictionaryJsonEncoder(
197202
val qualifiedName = dictionaryState.a.getQualifiedName(Symbol.Enum(t.node)).toString
198203
s"${qualifiedName}.${v._1}".asJson // FQN of the enum constant
199204
}
200-
case Value.Struct(Value.AnonStruct(members), t) => members.map((key, value) => (key.toString -> valueAsJson(value))).asJson
205+
case v: Value.Struct => structValueAsJson(v)
201206
case _ => value.toString.asJson
202207
}
203208
}
@@ -280,7 +285,7 @@ case class DictionaryJsonEncoder(
280285
"members" -> membersFormatted.toMap.asJson,
281286
)
282287
val optionalValues = Map(
283-
"default" -> default,
288+
"default" -> default.map(valueAsJson),
284289
"annotation" -> concatAnnotations(preA, postA)
285290
)
286291
jsonWithOptionalValues(json, optionalValues)

compiler/tools/fpp-to-dict/test/top/BasicDpTopologyDictionary.ref.json

Lines changed: 91 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,6 @@
88
"dictionarySpecVersion" : "1.0.0"
99
},
1010
"typeDefinitions" : [
11-
{
12-
"kind" : "struct",
13-
"qualifiedName" : "FppTest.DpTestComponent.Complex",
14-
"members" : {
15-
"f1" : {
16-
"type" : {
17-
"name" : "FppTest.DpTestComponent.Data",
18-
"kind" : "qualifiedIdentifier"
19-
},
20-
"index" : 0,
21-
"annotation" : "A struct in the struct"
22-
},
23-
"f2" : {
24-
"type" : {
25-
"name" : "U32",
26-
"kind" : "integer",
27-
"size" : 32,
28-
"signed" : false
29-
},
30-
"index" : 1,
31-
"annotation" : "A simple U32 field"
32-
}
33-
},
34-
"default" : {
35-
"f1" : {
36-
"u16Field" : 0
37-
},
38-
"f2" : 0
39-
},
40-
"annotation" : "Data for a ComplexRecord"
41-
},
4211
{
4312
"kind" : "alias",
4413
"qualifiedName" : "FwTlmPacketizeIdType",
@@ -83,6 +52,55 @@
8352
],
8453
"default" : "Fw.DpState.UNTRANSMITTED"
8554
},
55+
{
56+
"kind" : "struct",
57+
"qualifiedName" : "FppTest.DpTestComponent.Complex",
58+
"members" : {
59+
"f1" : {
60+
"type" : {
61+
"name" : "FppTest.DpTestComponent.Data",
62+
"kind" : "qualifiedIdentifier"
63+
},
64+
"index" : 0,
65+
"size" : 2,
66+
"annotation" : "A struct in the struct"
67+
},
68+
"f2" : {
69+
"type" : {
70+
"name" : "U32",
71+
"kind" : "integer",
72+
"size" : 32,
73+
"signed" : false
74+
},
75+
"index" : 1,
76+
"annotation" : "A simple U32 field"
77+
}
78+
},
79+
"default" : {
80+
"f1" : [
81+
{
82+
"u16Field" : [
83+
10,
84+
10,
85+
10,
86+
10,
87+
10
88+
]
89+
},
90+
{
91+
"u16Field" : [
92+
10,
93+
10,
94+
10,
95+
10,
96+
10
97+
]
98+
}
99+
],
100+
"f2" : 0
101+
},
102+
"annotation" : "Data for a ComplexRecord"
103+
},
86104
{
87105
"kind" : "alias",
88106
"qualifiedName" : "BaseIdType",
@@ -206,6 +224,31 @@
206224
"signed" : false
207225
}
208226
},
227+
{
228+
"kind" : "struct",
229+
"qualifiedName" : "FppTest.DpTestComponent.Data",
230+
"members" : {
231+
"u16Field" : {
232+
"type" : {
233+
"name" : "FppTest.DpTestComponent.AliasU16",
234+
"kind" : "qualifiedIdentifier"
235+
},
236+
"index" : 0,
237+
"size" : 5,
238+
"annotation" : "A U16 field"
239+
}
240+
},
241+
"default" : {
242+
"u16Field" : [
243+
10,
244+
10,
245+
10,
246+
10,
247+
10
248+
]
249+
},
250+
"annotation" : "Data for a DataRecord"
251+
},
209252
{
210253
"kind" : "alias",
211254
"qualifiedName" : "FwDpIdType",
@@ -220,6 +263,23 @@
220263
"signed" : false
221264
}
222265
},
266+
{
267+
"kind" : "alias",
268+
"qualifiedName" : "FwTimeBaseStoreType",
269+
"type" : {
270+
"name" : "U16",
271+
"kind" : "integer",
272+
"size" : 16,
273+
"signed" : false
274+
},
275+
"underlyingType" : {
276+
"name" : "U16",
277+
"kind" : "integer",
278+
"size" : 16,
279+
"signed" : false
280+
},
281+
"annotation" : "The type used to serialize a time base value"
282+
},
223283
{
224284
"kind" : "alias",
225285
"qualifiedName" : "FwChanIdType",
@@ -275,41 +335,6 @@
275335
"size" : 32,
276336
"signed" : false
277337
}
278-
},
279-
{
280-
"kind" : "alias",
281-
"qualifiedName" : "FwTimeBaseStoreType",
282-
"type" : {
283-
"name" : "U16",
284-
"kind" : "integer",
285-
"size" : 16,
286-
"signed" : false
287-
},
288-
"underlyingType" : {
289-
"name" : "U16",
290-
"kind" : "integer",
291-
"size" : 16,
292-
"signed" : false
293-
},
294-
"annotation" : "The type used to serialize a time base value"
295-
},
296-
{
297-
"kind" : "struct",
298-
"qualifiedName" : "FppTest.DpTestComponent.Data",
299-
"members" : {
300-
"u16Field" : {
301-
"type" : {
302-
"name" : "FppTest.DpTestComponent.AliasU16",
303-
"kind" : "qualifiedIdentifier"
304-
},
305-
"index" : 0,
306-
"annotation" : "A U16 field"
307-
}
308-
},
309-
"default" : {
310-
"u16Field" : 0
311-
},
312-
"annotation" : "Data for a DataRecord"
313338
}
314339
],
315340
"constants" : [

compiler/tools/fpp-to-dict/test/top/DictionaryDefsTopologyDictionary.ref.json

Lines changed: 66 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,6 @@
7070
],
7171
"default" : "Fw.DpState.UNTRANSMITTED"
7272
},
73-
{
74-
"kind" : "alias",
75-
"qualifiedName" : "BaseIdType",
76-
"type" : {
77-
"name" : "U32",
78-
"kind" : "integer",
79-
"size" : 32,
80-
"signed" : false
81-
},
82-
"underlyingType" : {
83-
"name" : "U32",
84-
"kind" : "integer",
85-
"size" : 32,
86-
"signed" : false
87-
}
88-
},
8973
{
9074
"kind" : "alias",
9175
"qualifiedName" : "FwEventIdType",
@@ -229,6 +213,72 @@
229213
"signed" : false
230214
}
231215
},
216+
{
217+
"kind" : "alias",
218+
"qualifiedName" : "BaseIdType",
219+
"type" : {
220+
"name" : "U32",
221+
"kind" : "integer",
222+
"size" : 32,
223+
"signed" : false
224+
},
225+
"underlyingType" : {
226+
"name" : "U32",
227+
"kind" : "integer",
228+
"size" : 32,
229+
"signed" : false
230+
}
231+
},
232+
{
233+
"kind" : "struct",
234+
"qualifiedName" : "S",
235+
"members" : {
236+
"X" : {
237+
"type" : {
238+
"name" : "string",
239+
"kind" : "string",
240+
"size" : 256
241+
},
242+
"index" : 0,
243+
"size" : 1
244+
},
245+
"Y" : {
246+
"type" : {
247+
"name" : "A2",
248+
"kind" : "qualifiedIdentifier"
249+
},
250+
"index" : 1,
251+
"size" : 2
252+
},
253+
"Z" : {
254+
"type" : {
255+
"name" : "S2",
256+
"kind" : "qualifiedIdentifier"
257+
},
258+
"index" : 2
259+
}
260+
},
261+
"default" : {
262+
"X" : [
263+
""
264+
],
265+
"Y" : [
266+
[
267+
0,
268+
0,
269+
0
270+
],
271+
[
272+
0,
273+
0,
274+
0
275+
]
276+
],
277+
"Z" : {
278+
"X" : 0
279+
}
280+
}
281+
},
232282
{
233283
"kind" : "alias",
234284
"qualifiedName" : "FwTimeContextStoreType",
@@ -306,45 +356,6 @@
306356
"signed" : false
307357
}
308358
},
309-
{
310-
"kind" : "struct",
311-
"qualifiedName" : "S",
312-
"members" : {
313-
"X" : {
314-
"type" : {
315-
"name" : "string",
316-
"kind" : "string",
317-
"size" : 256
318-
},
319-
"index" : 0
320-
},
321-
"Y" : {
322-
"type" : {
323-
"name" : "A2",
324-
"kind" : "qualifiedIdentifier"
325-
},
326-
"index" : 1
327-
},
328-
"Z" : {
329-
"type" : {
330-
"name" : "S2",
331-
"kind" : "qualifiedIdentifier"
332-
},
333-
"index" : 2
334-
}
335-
},
336-
"default" : {
337-
"X" : "",
338-
"Y" : [
339-
0,
340-
0,
341-
0
342-
],
343-
"Z" : {
344-
"X" : 0
345-
}
346-
}
347-
},
348359
{
349360
"kind" : "alias",
350361
"qualifiedName" : "FwSizeType",

0 commit comments

Comments
 (0)