2020-01-02 15:13:47 -05:00
|
|
|
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
|
2019-03-08 09:25:16 +09:00
|
|
|
type Writer = Deno.Writer;
|
2020-04-01 15:23:39 -04:00
|
|
|
import { decode, encode } from "../encoding/utf8.ts";
|
2019-02-11 08:49:48 +09:00
|
|
|
|
|
|
|
/** Writer utility for buffering string chunks */
|
|
|
|
export class StringWriter implements Writer {
|
|
|
|
private chunks: Uint8Array[] = [];
|
2019-10-06 01:02:34 +09:00
|
|
|
private byteLength = 0;
|
2019-05-30 14:59:30 +02:00
|
|
|
private cache: string | undefined;
|
2019-02-11 08:49:48 +09:00
|
|
|
|
|
|
|
constructor(private base: string = "") {
|
|
|
|
const c = encode(base);
|
|
|
|
this.chunks.push(c);
|
|
|
|
this.byteLength += c.byteLength;
|
|
|
|
}
|
|
|
|
|
2020-03-20 14:38:34 +01:00
|
|
|
write(p: Uint8Array): Promise<number> {
|
2019-02-11 08:49:48 +09:00
|
|
|
this.chunks.push(p);
|
|
|
|
this.byteLength += p.byteLength;
|
2019-05-30 14:59:30 +02:00
|
|
|
this.cache = undefined;
|
2020-03-20 14:38:34 +01:00
|
|
|
return Promise.resolve(p.byteLength);
|
2019-02-11 08:49:48 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
toString(): string {
|
|
|
|
if (this.cache) {
|
|
|
|
return this.cache;
|
|
|
|
}
|
|
|
|
const buf = new Uint8Array(this.byteLength);
|
|
|
|
let offs = 0;
|
|
|
|
for (const chunk of this.chunks) {
|
|
|
|
buf.set(chunk, offs);
|
|
|
|
offs += chunk.byteLength;
|
|
|
|
}
|
|
|
|
this.cache = decode(buf);
|
2020-02-07 16:23:38 +09:00
|
|
|
return this.cache;
|
2019-02-11 08:49:48 +09:00
|
|
|
}
|
|
|
|
}
|