cuelang.org/go@v0.10.1/cue/testdata/disjunctions/embed.txtar (about) 1 -- in.cue -- 2 // Given the existence of this field, embedDefault is a struct. This 3 // means that embedding this conjunction into `embedDefault` itself should 4 // make it resolve to `{a: 2}`. 5 6 default: { 7 y: *1 | {a: 2} 8 y 9 } 10 11 unambiguous: { 12 y: 1 | {a: 2} 13 y 14 } 15 16 forDefault: { 17 y: *1 | {a: 2} 18 for x in [1] {y} 19 } 20 21 // Carry over default to first disjunct. 22 openDefault: { 23 #y: *1 | {a: 2} 24 #y 25 } 26 27 openAmbiguous: { 28 #y: 1 | {a: 2} 29 #y 30 } 31 32 forceStruct: { 33 #y: 1 | {a: 2} 34 #y 35 {} 36 } 37 38 defaultsMulti: { 39 a: { 40 #def: { 41 *{} | {a: string} | {b: string} 42 *{} | {c: string} | {d: string} 43 } 44 45 a: #def & {a: "foo"} 46 } 47 48 b: { 49 #def: { 50 *{} | {a: string} | {b: string} 51 *{} | {c: string} | {d: string} 52 *{} | {d: string} | {e: string} 53 } 54 55 a: #def & {a: "foo", e: "bar"} 56 } 57 } 58 59 nested: { 60 a: 1 | 2 | *( 61 (3 | 4 | *( 5 | 6 | *7)) & ( 3 | 4 | ( *7 | 8 ))) 62 } 63 -- out/eval/stats -- 64 Leaks: 1 65 Freed: 416 66 Reused: 381 67 Allocs: 36 68 Retain: 1 69 70 Unifications: 257 71 Conjuncts: 478 72 Disjuncts: 417 73 -- out/evalalpha -- 74 (struct){ 75 default: (struct){ 76 y: ((int|struct)){ |(*(int){ 1 }, (struct){ 77 a: (int){ 2 } 78 }) } 79 a: (int){ 2 } 80 } 81 unambiguous: (struct){ 82 y: ((int|struct)){ |((int){ 1 }, (struct){ 83 a: (int){ 2 } 84 }) } 85 a: (int){ 2 } 86 } 87 forDefault: (struct){ 88 y: ((int|struct)){ |(*(int){ 1 }, (struct){ 89 a: (int){ 2 } 90 }) } 91 a: (int){ 2 } 92 } 93 openDefault: ((int|struct)){ |(*(int){ 94 1 95 #y: ((int|struct)){ |(*(int){ 1 }, (#struct){ 96 a: (int){ 2 } 97 }) } 98 }, (#struct){ 99 #y: ((int|struct)){ |(*(int){ 1 }, (#struct){ 100 a: (int){ 2 } 101 }) } 102 a: (int){ 2 } 103 }) } 104 openAmbiguous: ((int|struct)){ |((int){ 105 1 106 #y: ((int|struct)){ |((int){ 1 }, (#struct){ 107 a: (int){ 2 } 108 }) } 109 }, (#struct){ 110 #y: ((int|struct)){ |((int){ 1 }, (#struct){ 111 a: (int){ 2 } 112 }) } 113 a: (int){ 2 } 114 }) } 115 forceStruct: (#struct){ 116 #y: ((int|struct)){ |((int){ 1 }, (#struct){ 117 a: (int){ 2 } 118 }) } 119 a: (int){ 2 } 120 } 121 defaultsMulti: (struct){ 122 a: (struct){ 123 #def: (#struct){ |(*(#struct){ 124 }, (#struct){ 125 c: (string){ string } 126 }, (#struct){ 127 d: (string){ string } 128 }, (#struct){ 129 a: (string){ string } 130 }, (#struct){ 131 a: (string){ string } 132 c: (string){ string } 133 }, (#struct){ 134 a: (string){ string } 135 d: (string){ string } 136 }, (#struct){ 137 b: (string){ string } 138 }, (#struct){ 139 b: (string){ string } 140 c: (string){ string } 141 }, (#struct){ 142 b: (string){ string } 143 d: (string){ string } 144 }) } 145 a: (#struct){ |((#struct){ 146 a: (string){ "foo" } 147 }, (#struct){ 148 a: (string){ "foo" } 149 c: (string){ string } 150 }, (#struct){ 151 a: (string){ "foo" } 152 d: (string){ string } 153 }) } 154 } 155 b: (struct){ 156 #def: (#struct){ |(*(#struct){ 157 }, (#struct){ 158 d: (string){ string } 159 }, (#struct){ 160 e: (string){ string } 161 }, (#struct){ 162 c: (string){ string } 163 }, (#struct){ 164 c: (string){ string } 165 d: (string){ string } 166 }, (#struct){ 167 c: (string){ string } 168 e: (string){ string } 169 }, (#struct){ 170 d: (string){ string } 171 e: (string){ string } 172 }, (#struct){ 173 a: (string){ string } 174 }, (#struct){ 175 a: (string){ string } 176 d: (string){ string } 177 }, (#struct){ 178 a: (string){ string } 179 e: (string){ string } 180 }, (#struct){ 181 a: (string){ string } 182 c: (string){ string } 183 }, (#struct){ 184 a: (string){ string } 185 c: (string){ string } 186 d: (string){ string } 187 }, (#struct){ 188 a: (string){ string } 189 c: (string){ string } 190 e: (string){ string } 191 }, (#struct){ 192 a: (string){ string } 193 d: (string){ string } 194 e: (string){ string } 195 }, (#struct){ 196 b: (string){ string } 197 }, (#struct){ 198 b: (string){ string } 199 d: (string){ string } 200 }, (#struct){ 201 b: (string){ string } 202 e: (string){ string } 203 }, (#struct){ 204 b: (string){ string } 205 c: (string){ string } 206 }, (#struct){ 207 b: (string){ string } 208 c: (string){ string } 209 d: (string){ string } 210 }, (#struct){ 211 b: (string){ string } 212 c: (string){ string } 213 e: (string){ string } 214 }, (#struct){ 215 b: (string){ string } 216 d: (string){ string } 217 e: (string){ string } 218 }) } 219 a: (#struct){ |((#struct){ 220 a: (string){ "foo" } 221 e: (string){ "bar" } 222 }, (#struct){ 223 a: (string){ "foo" } 224 e: (string){ "bar" } 225 c: (string){ string } 226 }, (#struct){ 227 a: (string){ "foo" } 228 e: (string){ "bar" } 229 d: (string){ string } 230 }) } 231 } 232 } 233 nested: (struct){ 234 a: (int){ |(*(int){ 7 }, (int){ 2 }, (int){ 3 }, (int){ 4 }, (int){ 1 }) } 235 } 236 } 237 -- diff/-out/evalalpha<==>+out/eval -- 238 diff old new 239 --- old 240 +++ new 241 @@ -69,7 +69,7 @@ 242 b: (string){ string } 243 d: (string){ string } 244 }) } 245 - a: (#struct){ |(*(#struct){ 246 + a: (#struct){ |((#struct){ 247 a: (string){ "foo" } 248 }, (#struct){ 249 a: (string){ "foo" } 250 @@ -143,7 +143,7 @@ 251 d: (string){ string } 252 e: (string){ string } 253 }) } 254 - a: (#struct){ |(*(#struct){ 255 + a: (#struct){ |((#struct){ 256 a: (string){ "foo" } 257 e: (string){ "bar" } 258 }, (#struct){ 259 -- diff/explanation -- 260 The old algorithm was incorrect: the default value should not be carried: 261 only {b: string} of the first disjunction can be part of the result. As it 262 is not a default, the result of the disjunction cross product cannot be a 263 default either. 264 -- out/eval -- 265 (struct){ 266 default: (struct){ 267 y: ((int|struct)){ |(*(int){ 1 }, (struct){ 268 a: (int){ 2 } 269 }) } 270 a: (int){ 2 } 271 } 272 unambiguous: (struct){ 273 y: ((int|struct)){ |((int){ 1 }, (struct){ 274 a: (int){ 2 } 275 }) } 276 a: (int){ 2 } 277 } 278 forDefault: (struct){ 279 y: ((int|struct)){ |(*(int){ 1 }, (struct){ 280 a: (int){ 2 } 281 }) } 282 a: (int){ 2 } 283 } 284 openDefault: ((int|struct)){ |(*(int){ 285 1 286 #y: ((int|struct)){ |(*(int){ 1 }, (#struct){ 287 a: (int){ 2 } 288 }) } 289 }, (#struct){ 290 #y: ((int|struct)){ |(*(int){ 1 }, (#struct){ 291 a: (int){ 2 } 292 }) } 293 a: (int){ 2 } 294 }) } 295 openAmbiguous: ((int|struct)){ |((int){ 296 1 297 #y: ((int|struct)){ |((int){ 1 }, (#struct){ 298 a: (int){ 2 } 299 }) } 300 }, (#struct){ 301 #y: ((int|struct)){ |((int){ 1 }, (#struct){ 302 a: (int){ 2 } 303 }) } 304 a: (int){ 2 } 305 }) } 306 forceStruct: (#struct){ 307 #y: ((int|struct)){ |((int){ 1 }, (#struct){ 308 a: (int){ 2 } 309 }) } 310 a: (int){ 2 } 311 } 312 defaultsMulti: (struct){ 313 a: (struct){ 314 #def: (#struct){ |(*(#struct){ 315 }, (#struct){ 316 c: (string){ string } 317 }, (#struct){ 318 d: (string){ string } 319 }, (#struct){ 320 a: (string){ string } 321 }, (#struct){ 322 a: (string){ string } 323 c: (string){ string } 324 }, (#struct){ 325 a: (string){ string } 326 d: (string){ string } 327 }, (#struct){ 328 b: (string){ string } 329 }, (#struct){ 330 b: (string){ string } 331 c: (string){ string } 332 }, (#struct){ 333 b: (string){ string } 334 d: (string){ string } 335 }) } 336 a: (#struct){ |(*(#struct){ 337 a: (string){ "foo" } 338 }, (#struct){ 339 a: (string){ "foo" } 340 c: (string){ string } 341 }, (#struct){ 342 a: (string){ "foo" } 343 d: (string){ string } 344 }) } 345 } 346 b: (struct){ 347 #def: (#struct){ |(*(#struct){ 348 }, (#struct){ 349 d: (string){ string } 350 }, (#struct){ 351 e: (string){ string } 352 }, (#struct){ 353 c: (string){ string } 354 }, (#struct){ 355 c: (string){ string } 356 d: (string){ string } 357 }, (#struct){ 358 c: (string){ string } 359 e: (string){ string } 360 }, (#struct){ 361 d: (string){ string } 362 e: (string){ string } 363 }, (#struct){ 364 a: (string){ string } 365 }, (#struct){ 366 a: (string){ string } 367 d: (string){ string } 368 }, (#struct){ 369 a: (string){ string } 370 e: (string){ string } 371 }, (#struct){ 372 a: (string){ string } 373 c: (string){ string } 374 }, (#struct){ 375 a: (string){ string } 376 c: (string){ string } 377 d: (string){ string } 378 }, (#struct){ 379 a: (string){ string } 380 c: (string){ string } 381 e: (string){ string } 382 }, (#struct){ 383 a: (string){ string } 384 d: (string){ string } 385 e: (string){ string } 386 }, (#struct){ 387 b: (string){ string } 388 }, (#struct){ 389 b: (string){ string } 390 d: (string){ string } 391 }, (#struct){ 392 b: (string){ string } 393 e: (string){ string } 394 }, (#struct){ 395 b: (string){ string } 396 c: (string){ string } 397 }, (#struct){ 398 b: (string){ string } 399 c: (string){ string } 400 d: (string){ string } 401 }, (#struct){ 402 b: (string){ string } 403 c: (string){ string } 404 e: (string){ string } 405 }, (#struct){ 406 b: (string){ string } 407 d: (string){ string } 408 e: (string){ string } 409 }) } 410 a: (#struct){ |(*(#struct){ 411 a: (string){ "foo" } 412 e: (string){ "bar" } 413 }, (#struct){ 414 a: (string){ "foo" } 415 e: (string){ "bar" } 416 c: (string){ string } 417 }, (#struct){ 418 a: (string){ "foo" } 419 e: (string){ "bar" } 420 d: (string){ string } 421 }) } 422 } 423 } 424 nested: (struct){ 425 a: (int){ |(*(int){ 7 }, (int){ 2 }, (int){ 3 }, (int){ 4 }, (int){ 1 }) } 426 } 427 } 428 -- out/compile -- 429 --- in.cue 430 { 431 default: { 432 y: (*1|{ 433 a: 2 434 }) 435 〈0;y〉 436 } 437 unambiguous: { 438 y: (1|{ 439 a: 2 440 }) 441 〈0;y〉 442 } 443 forDefault: { 444 y: (*1|{ 445 a: 2 446 }) 447 for _, x in [ 448 1, 449 ] { 450 〈2;y〉 451 } 452 } 453 openDefault: { 454 #y: (*1|{ 455 a: 2 456 }) 457 〈0;#y〉 458 } 459 openAmbiguous: { 460 #y: (1|{ 461 a: 2 462 }) 463 〈0;#y〉 464 } 465 forceStruct: { 466 #y: (1|{ 467 a: 2 468 }) 469 〈0;#y〉 470 {} 471 } 472 defaultsMulti: { 473 a: { 474 #def: { 475 (*{}|{ 476 a: string 477 }|{ 478 b: string 479 }) 480 (*{}|{ 481 c: string 482 }|{ 483 d: string 484 }) 485 } 486 a: (〈0;#def〉 & { 487 a: "foo" 488 }) 489 } 490 b: { 491 #def: { 492 (*{}|{ 493 a: string 494 }|{ 495 b: string 496 }) 497 (*{}|{ 498 c: string 499 }|{ 500 d: string 501 }) 502 (*{}|{ 503 d: string 504 }|{ 505 e: string 506 }) 507 } 508 a: (〈0;#def〉 & { 509 a: "foo" 510 e: "bar" 511 }) 512 } 513 } 514 nested: { 515 a: (1|2|*((3|4|*(5|6|*7)) & (3|4|(*7|8)))) 516 } 517 }