feat: expose writeAll() and writeAllSync() (#2298)

Symmetric with `readAll()` and `readAllSync()`. Also used in `xeval`.
Also correct usage in `writeFile()`/`writeFileSync()`.
This commit is contained in:
Kevin (Kun) "Kassimo" Qian 2019-07-23 08:16:39 -07:00 committed by Ryan Dahl
parent 70de8dd51d
commit e49d1e16ca
5 changed files with 46 additions and 17 deletions

View file

@ -274,3 +274,21 @@ export function readAllSync(r: SyncReader): Uint8Array {
buf.readFromSync(r); buf.readFromSync(r);
return buf.bytes(); return buf.bytes();
} }
/** Write all the content of `arr` to `w`.
*/
export async function writeAll(w: Writer, arr: Uint8Array): Promise<void> {
let nwritten = 0;
while (nwritten < arr.length) {
nwritten += await w.write(arr.subarray(nwritten));
}
}
/** Write synchronously all the content of `arr` to `w`.
*/
export function writeAllSync(w: SyncWriter, arr: Uint8Array): void {
let nwritten = 0;
while (nwritten < arr.length) {
nwritten += w.writeSync(arr.subarray(nwritten));
}
}

View file

@ -5,7 +5,7 @@
// https://github.com/golang/go/blob/master/LICENSE // https://github.com/golang/go/blob/master/LICENSE
import { assertEquals, test } from "./test_util.ts"; import { assertEquals, test } from "./test_util.ts";
const { Buffer, readAll, readAllSync } = Deno; const { Buffer, readAll, readAllSync, writeAll, writeAllSync } = Deno;
type Buffer = Deno.Buffer; type Buffer = Deno.Buffer;
// N controls how many iterations of certain checks are performed. // N controls how many iterations of certain checks are performed.
@ -253,3 +253,25 @@ test(function testReadAllSync(): void {
assertEquals(testBytes[i], actualBytes[i]); assertEquals(testBytes[i], actualBytes[i]);
} }
}); });
test(async function testWriteAll(): Promise<void> {
init();
const writer = new Buffer();
await writeAll(writer, testBytes);
const actualBytes = writer.bytes();
assertEquals(testBytes.byteLength, actualBytes.byteLength);
for (let i = 0; i < testBytes.length; ++i) {
assertEquals(testBytes[i], actualBytes[i]);
}
});
test(function testWriteAllSync(): void {
init();
const writer = new Buffer();
writeAllSync(writer, testBytes);
const actualBytes = writer.bytes();
assertEquals(testBytes.byteLength, actualBytes.byteLength);
for (let i = 0; i < testBytes.length; ++i) {
assertEquals(testBytes[i], actualBytes[i]);
}
});

View file

@ -38,7 +38,7 @@ export {
ReadWriteCloser, ReadWriteCloser,
ReadWriteSeeker ReadWriteSeeker
} from "./io"; } from "./io";
export { Buffer, readAll, readAllSync } from "./buffer"; export { Buffer, readAll, readAllSync, writeAll, writeAllSync } from "./buffer";
export { mkdirSync, mkdir } from "./mkdir"; export { mkdirSync, mkdir } from "./mkdir";
export { export {
makeTempDirSync, makeTempDirSync,

View file

@ -2,6 +2,7 @@
import { stat, statSync } from "./stat"; import { stat, statSync } from "./stat";
import { open, openSync } from "./files"; import { open, openSync } from "./files";
import { chmod, chmodSync } from "./chmod"; import { chmod, chmodSync } from "./chmod";
import { writeAll, writeAllSync } from "./buffer";
/** Options for writing to a file. /** Options for writing to a file.
* `perm` would change the file's permission if set. * `perm` would change the file's permission if set.
@ -40,7 +41,7 @@ export function writeFileSync(
chmodSync(filename, options.perm); chmodSync(filename, options.perm);
} }
file.writeSync(data); writeAllSync(file, data);
file.close(); file.close();
} }
@ -70,6 +71,6 @@ export async function writeFile(
await chmod(filename, options.perm); await chmod(filename, options.perm);
} }
await file.write(data); await writeAll(file, data);
file.close(); file.close();
} }

View file

@ -1,22 +1,10 @@
import { Buffer } from "./buffer"; import { Buffer, writeAll } from "./buffer";
import { stdin } from "./files"; import { stdin } from "./files";
import { TextEncoder, TextDecoder } from "./text_encoding"; import { TextEncoder, TextDecoder } from "./text_encoding";
import { Reader, EOF } from "./io"; import { Reader, EOF } from "./io";
export type XevalFunc = (v: string) => void; export type XevalFunc = (v: string) => void;
async function writeAll(buffer: Buffer, arr: Uint8Array): Promise<void> {
let bytesWritten = 0;
while (bytesWritten < arr.length) {
try {
const nwritten = await buffer.write(arr.subarray(bytesWritten));
bytesWritten += nwritten;
} catch {
return;
}
}
}
// TODO(kevinkassimo): Move this utility to deno_std. // TODO(kevinkassimo): Move this utility to deno_std.
// Import from there once doable. // Import from there once doable.
// Read from reader until EOF and emit string chunks separated // Read from reader until EOF and emit string chunks separated