% crochet

type base64(x is text);

command #base64 encode: (Text is text)
requires bytes-only :: Text is-ascii
do
  new base64(foreign base64.encode(Text))
test
  assert (#base64 encode: "It was a dark, stormy night").x
    === "SXQgd2FzIGEgZGFyaywgc3Rvcm15IG5pZ2h0";

  assert (#base64 encode: "").x
    === "";

  assert (#base64 encode: "a").x
    === "YQ==";
end

command base64 to-text =
  foreign base64.decode(self.x)
test
  assert (new base64("SXQgd2FzIGEgZGFyaywgc3Rvcm15IG5pZ2h0")) to-text
    === "It was a dark, stormy night";

  assert (new base64("")) to-text
    === "";

  assert (new base64("YQ==")) to-text
    === "a";
end

command base64 === (That is base64) = self.x === That.x;

test "decode(encode(X)) === X" do
  assert (#base64 encode: "It was a dark, stormy night" | to-text)
    === "It was a dark, stormy night";
end
