aboutsummaryrefslogtreecommitdiff
path: root/format/tsv/writer.ha
diff options
context:
space:
mode:
Diffstat (limited to 'format/tsv/writer.ha')
-rw-r--r--format/tsv/writer.ha63
1 files changed, 63 insertions, 0 deletions
diff --git a/format/tsv/writer.ha b/format/tsv/writer.ha
new file mode 100644
index 0000000..f1f045b
--- /dev/null
+++ b/format/tsv/writer.ha
@@ -0,0 +1,63 @@
+use io;
+use strings;
+use fmt;
+use memio;
+
+// Writes a slice strings to a handle in TSV format. Existing tabs in the record
+// are removed.
+export fn writerecord(w: io::handle, record: []str) (void | io::error) = {
+ let sep = "";
+ for (const field .. record) {
+ const pfield = strings::replace(field, "\t", "");
+ defer free(pfield);
+ fmt::fprintf(w, "{}{}", sep, pfield)!;
+ sep = "\t";
+ };
+ fmt::fprintln(w)!;
+};
+
+// Writes a slice of string slices to a handle in TSV format. Existing tabs in
+// the records are removed.
+export fn writerecords(w: io::handle, records: [][]str) (void | io::error) = {
+ for (const record .. records) {
+ writerecord(w, record)?;
+ };
+};
+
+@test fn writenormal() void = {
+ const expected = "col1\tcol2\tcol3
+1\t2\t3
+4\t5\t6\n";
+ const input: [][]str = [
+ ["col1", "col2", "col3"],
+ ["1", "2", "3"],
+ ["4", "5", "6"],
+ ];
+ const st = memio::dynamic();
+ defer io::close(&st)!;
+ writerecords(&st, input)!;
+ const actual = memio::string(&st)!;
+ fmt::errorfln("expected: {}EOF", expected)!;
+ fmt::errorln()!;
+ fmt::errorfln("actual: {}EOF", actual)!;
+ assert(actual == expected);
+};
+
+@test fn writetabs() void = {
+ const expected = "col1\tcol2\tcol3
+1\t2\t3
+4\t5\t6\n";
+ const input: [][]str = [
+ ["col1\t", "co\tl2", "col3"],
+ ["1", "2", "\t3"],
+ ["4\t", "\t\t5\t", "6"],
+ ];
+ const st = memio::dynamic();
+ defer io::close(&st)!;
+ writerecords(&st, input)!;
+ const actual = memio::string(&st)!;
+ fmt::errorfln("expected: {}EOF", expected)!;
+ fmt::errorln()!;
+ fmt::errorfln("actual: {}EOF", actual)!;
+ assert(actual == expected);
+};