@@ -1661,24 +1661,27 @@ class Std(
16611661 rec(Materializer (value)(ev)).render
16621662 },
16631663 builtin(" base64" , " input" ) { (_, _, input : Val ) =>
1664- val b : Array [Int ] = input match {
1665- case Val .Str (_, value) => value.indices.map(value.codePointAt).toArray
1666- case arr : Val .Arr =>
1667- if (! arr.forall(_.isInstanceOf [Val .Num ])) {
1668- Error .fail(" Expected an array of numbers or a string" )
1664+ input match {
1665+ case Val .Str (_, value) =>
1666+ Base64 .getEncoder.encodeToString(value.getBytes(" UTF-8" ))
1667+ case arr : Val .Arr =>
1668+ val byteArr = new Array [Byte ](arr.length)
1669+ for (i <- 0 until arr.length) {
1670+ val v = arr.force(i)
1671+ if (! v.isInstanceOf [Val .Num ]) {
1672+ Error .fail(f " Expected an array of numbers, got a ${v.prettyName} at position $i" )
1673+ }
1674+ val vInt = v.asInt
1675+ if (vInt < 0 || vInt > 255 ) {
1676+ Error .fail(
1677+ f " Found an invalid codepoint value at position $i (must be 0 <= X <= 255), got $vInt"
1678+ )
1679+ }
1680+ byteArr(i) = vInt.toByte
16691681 }
1670- arr.iterator.map(_.cast[ Val . Num ].asInt).toArray
1682+ Base64 .getEncoder.encodeToString(byteArr)
16711683 case x => Error .fail(" Cannot base64 encode " + x.prettyName)
16721684 }
1673-
1674- for (i <- b) {
1675- if (i < 0 || i > 255 ) {
1676- Error .fail(
1677- f " Found an invalid codepoint value in the ${input.prettyName} (must be 0 <= X <= 255), got $i"
1678- )
1679- }
1680- }
1681- Base64 .getEncoder.encodeToString(b.map(_.toByte))
16821685 },
16831686 builtin(" base64Decode" , " str" ) { (_, _, str : String ) =>
16841687 try {
0 commit comments