@@ -129,14 +129,15 @@ object Std {
129
129
}
130
130
},
131
131
builtin(" codepoint" , " str" ){ (wd, extVars, v1 : Val ) =>
132
- v1.asInstanceOf [Val .Str ].value.charAt(0 ).toInt
132
+ v1.cast [Val .Str ].value.charAt(0 ).toInt
133
133
},
134
134
builtin(" length" , " x" ){ (wd, extVars, v1 : Val ) =>
135
135
v1 match {
136
136
case Val .Str (s) => s.length
137
137
case Val .Arr (s) => s.length
138
138
case o : Val .Obj => o.getVisibleKeys().count(! _._2)
139
139
case o : Val .Func => o.params.args.length
140
+ case _ => throw new DelegateError (" Cannot get length of " + v1.prettyName)
140
141
}
141
142
},
142
143
builtin(" objectHas" , " o" , " f" ){ (wd, extVars, v1 : Val .Obj , v2 : String ) =>
@@ -147,8 +148,7 @@ object Std {
147
148
},
148
149
builtin(" objectFields" , " o" ){ (wd, extVars, v1 : Val .Obj ) =>
149
150
Val .Arr (
150
- v1.asInstanceOf [Val .Obj ]
151
- .getVisibleKeys()
151
+ v1.getVisibleKeys()
152
152
.collect{case (k, false ) => k}
153
153
.toSeq
154
154
.sorted
@@ -157,8 +157,7 @@ object Std {
157
157
},
158
158
builtin(" objectFieldsAll" , " o" ){ (wd, extVars, v1 : Val .Obj ) =>
159
159
Val .Arr (
160
- v1.asInstanceOf [Val .Obj ]
161
- .getVisibleKeys()
160
+ v1.getVisibleKeys()
162
161
.collect{case (k, _) => k}
163
162
.toSeq
164
163
.sorted
@@ -177,10 +176,17 @@ object Std {
177
176
}
178
177
},
179
178
builtin(" lines" , " arr" ){ (wd, extVars, v1 : Val .Arr ) =>
179
+ v1.value.map(_.force).foreach{
180
+ case _ : Val .Str | Val .Null => // donothing
181
+ case x => throw new DelegateError (" Cannot call .lines on " + x.prettyName)
182
+ }
180
183
Materializer .apply(v1, extVars, wd).asInstanceOf [ujson.Js .Arr ]
181
184
.value
182
185
.filter(_ != ujson.Js .Null )
183
- .map{case ujson.Js .Str (s) => s + " \n " }
186
+ .map{
187
+ case ujson.Js .Str (s) => s + " \n "
188
+ case _ => ??? /* we ensure it's all strings above */
189
+ }
184
190
.mkString
185
191
},
186
192
builtin(" format" , " str" , " vals" ){ (wd, extVars, v1 : String , v2 : Val ) =>
@@ -376,7 +382,16 @@ object Std {
376
382
builtin(" join" , " sep" , " arr" ){ (wd, extVars, sep : Val , arr : Val .Arr ) =>
377
383
val res : Val = sep match {
378
384
case Val .Str (s) =>
379
- Val .Str (arr.value.map(_.force).filter(_ != Val .Null ).map{case Val .Str (x) => x}.mkString(s))
385
+ Val .Str (
386
+ arr.value
387
+ .map(_.force)
388
+ .filter(_ != Val .Null )
389
+ .map{
390
+ case Val .Str (x) => x
391
+ case x => throw new DelegateError (" Cannot join " + x.prettyName)
392
+ }
393
+ .mkString(s)
394
+ )
380
395
case Val .Arr (sep) =>
381
396
val out = collection.mutable.Buffer .empty[Lazy ]
382
397
for (x <- arr.value){
@@ -385,9 +400,11 @@ object Std {
385
400
case Val .Arr (v) =>
386
401
if (out.nonEmpty) out.appendAll(sep)
387
402
out.appendAll(v)
403
+ case x => throw new DelegateError (" Cannot join " + x.prettyName)
388
404
}
389
405
}
390
406
Val .Arr (out)
407
+ case x => throw new DelegateError (" Cannot join " + x.prettyName)
391
408
}
392
409
res
393
410
},
@@ -397,6 +414,7 @@ object Std {
397
414
x.force match {
398
415
case Val .Null => // do nothing
399
416
case Val .Arr (v) => out.appendAll(v)
417
+ case x => throw new DelegateError (" Cannot call flattenArrays on " + x)
400
418
}
401
419
}
402
420
Val .Arr (out)
@@ -406,7 +424,12 @@ object Std {
406
424
def sect (x : ujson.Js .Obj ) = {
407
425
x.value.flatMap{
408
426
case (k, ujson.Js .Str (v)) => Seq (k + " = " + v)
409
- case (k, ujson.Js .Arr (vs)) => vs.map{case ujson.Js .Str (v) => k + " = " + v}
427
+ case (k, ujson.Js .Arr (vs)) =>
428
+ vs.map{
429
+ case ujson.Js .Str (v) => k + " = " + v
430
+ case x => throw new DelegateError (" Cannot call manifestIni on " + x.getClass)
431
+ }
432
+ case (k, x) => throw new DelegateError (" Cannot call manifestIni on " + x.getClass)
410
433
}
411
434
}
412
435
val lines = materialized.obj.get(" main" ).fold(Iterable [String ]())(x => sect(x.asInstanceOf [ujson.Js .Obj ])) ++
@@ -473,11 +496,16 @@ object Std {
473
496
case ujson.Js .Str (s) => s
474
497
case ujson.Js .Arr (Seq (ujson.Js .Str (t), attrs : ujson.Js .Obj , children@_* )) =>
475
498
tag(t)(
476
- attrs.value.map { case (k, ujson.Js .Str (v)) => attr(k) := v }.toSeq,
499
+ attrs.value.map {
500
+ case (k, ujson.Js .Str (v)) => attr(k) := v
501
+ case (k, v) => throw new DelegateError (" Cannot call manifestXmlJsonml on " + v.getClass)
502
+ }.toSeq,
477
503
children.map(rec)
478
504
)
479
505
case ujson.Js .Arr (Seq (ujson.Js .Str (t), children@_* )) =>
480
506
tag(t)(children.map(rec))
507
+ case x =>
508
+ throw new DelegateError (" Cannot call manifestXmlJsonml on " + x.getClass)
481
509
}
482
510
}
483
511
@@ -487,7 +515,8 @@ object Std {
487
515
builtin(" base64" , " v" ){ (wd, extVars, v : Val ) =>
488
516
v match {
489
517
case Val .Str (value) => Base64 .getEncoder().encodeToString(value.getBytes)
490
- case Val .Arr (bytes) => Base64 .getEncoder().encodeToString(bytes.map(_.force.asInstanceOf [Val .Num ].value.toByte).toArray)
518
+ case Val .Arr (bytes) => Base64 .getEncoder().encodeToString(bytes.map(_.force.cast[Val .Num ].value.toByte).toArray)
519
+ case x => throw new DelegateError (" Cannot base64 encode " + x.prettyName)
491
520
}
492
521
},
493
522
@@ -503,14 +532,15 @@ object Std {
503
532
Val .Arr (
504
533
505
534
if (vs.forall(_.force.isInstanceOf [Val .Str ])){
506
- vs.map(_.force.asInstanceOf [Val .Str ]).sortBy(_.value).map(Lazy (_))
535
+ vs.map(_.force.cast [Val .Str ]).sortBy(_.value).map(Lazy (_))
507
536
}else if (vs.forall(_.force.isInstanceOf [Val .Num ])){
508
- vs.map(_.force.asInstanceOf [Val .Num ]).sortBy(_.value).map(Lazy (_))
537
+ vs.map(_.force.cast [Val .Num ]).sortBy(_.value).map(Lazy (_))
509
538
}else {
510
539
???
511
540
}
512
541
)
513
542
case Val .Str (s) => Val .Arr (s.sorted.map(c => Lazy (Val .Str (c.toString))))
543
+ case x => throw new DelegateError (" Cannot sort " + x.prettyName)
514
544
}
515
545
},
516
546
builtin(" uniq" , " arr" ){ (wd, extVars, arr : Val .Arr ) =>
@@ -527,7 +557,9 @@ object Std {
527
557
vs0.map(_.asInstanceOf [ujson.Js .Str ]).sortBy(_.value)
528
558
}else if (vs0.forall(_.isInstanceOf [ujson.Js .Num ])){
529
559
vs0.map(_.asInstanceOf [ujson.Js .Num ]).sortBy(_.value)
530
- }else ???
560
+ }else {
561
+ throw new DelegateError (" Every element of the input must be of the same type, string or number" )
562
+ }
531
563
532
564
val out = collection.mutable.Buffer .empty[ujson.Js ]
533
565
for (v <- vs) if (out.isEmpty || out.last != v) out.append(v)
@@ -544,7 +576,9 @@ object Std {
544
576
vs0.map(_.asInstanceOf [ujson.Js .Str ]).sortBy(_.value)
545
577
}else if (vs0.forall(_.isInstanceOf [ujson.Js .Num ])){
546
578
vs0.map(_.asInstanceOf [ujson.Js .Num ]).sortBy(_.value)
547
- }else ???
579
+ }else {
580
+ throw new DelegateError (" Every element of the input must be of the same type, string or number" )
581
+ }
548
582
549
583
val out = collection.mutable.Buffer .empty[ujson.Js ]
550
584
for (v <- vs) if (out.isEmpty || out.last != v) out.append(v)
@@ -567,7 +601,9 @@ object Std {
567
601
vs0.map(_.asInstanceOf [ujson.Js .Str ]).sortBy(_.value)
568
602
}else if (vs0.forall(_.isInstanceOf [ujson.Js .Num ])){
569
603
vs0.map(_.asInstanceOf [ujson.Js .Num ]).sortBy(_.value)
570
- }else ???
604
+ }else {
605
+ throw new DelegateError (" Every element of the input must be of the same type, string or number" )
606
+ }
571
607
572
608
val out = collection.mutable.Buffer .empty[ujson.Js ]
573
609
for (v <- vs) if (out.isEmpty || out.last != v) out.append(v)
@@ -587,7 +623,9 @@ object Std {
587
623
vs0.map(_.asInstanceOf [ujson.Js .Str ]).sortBy(_.value)
588
624
}else if (vs0.forall(_.isInstanceOf [ujson.Js .Num ])){
589
625
vs0.map(_.asInstanceOf [ujson.Js .Num ]).sortBy(_.value)
590
- }else ???
626
+ }else {
627
+ throw new DelegateError (" Every element of the input must be of the same type, string or number" )
628
+ }
591
629
592
630
val out = collection.mutable.Buffer .empty[ujson.Js ]
593
631
for (v <- vs) if (out.isEmpty || out.last != v) out.append(v)
0 commit comments