}
format_map :: (output: ^conv.Format_Output, format: ^conv.Format, x: ^Map($K, $V)) {
- old_quote_strings := format.quote_strings;
- format.quote_strings = true;
- defer format.quote_strings = old_quote_strings;
-
output->write("{\n");
- for^ e: x.entries {
- output->write(" ");
- conv.format_any(output, format, .{^e.key, K});
- output->write(" => ");
- conv.format_any(output, format, .{^e.value, V});
- output->write("\n");
+ for^ x.entries {
+ conv.format(output, " {\"} => {\"}\n", it.key, it.value);
}
output->write("}");
}
}
-format :: (buffer: [] u8, format: str, va: ..any) -> str {
+format :: #match {}
+#match format (buffer: [] u8, format: str, va: ..any) -> str {
return format_va(buffer, format, ~~va);
}
+#match format (output: ^Format_Output, format: str, va: ..any) -> str {
+ return format_va(output, format, ~~va);
+}
-format_va :: (buffer: [] u8, format: str, va: [] any) -> str {
+format_va :: #match {}
+#match format_va (buffer: [] u8, format: str, va: [] any) -> str {
output := Format_Output.{ buffer.data, 0, buffer.count };
+ return format_va(^output, format, va);
+}
+
+#match format_va (output: ^Format_Output, format: str, va: [] any) -> str {
vararg_index := 0;
while i := 0; i < format.count {
formatting.custom_format = false;
}
+ case #char "\"" {
+ i += 1;
+ formatting.quote_strings = true;
+ }
+
case #char "}" {
arg := va[vararg_index];
vararg_index += 1;
- format_any(^output, ^formatting, arg);
+ format_any(output, ^formatting, arg);
break break;
}
write_format,
// Catch all for any type. Has a high precedence so you can easily override it.
- #precedence 1000 (w: ^Writer, a: $T) {
+ #precedence 1000 macro (w: ^Writer, a: $T) {
+ write_format :: write_format
write_format(w, "{}", a);
}
}
T ^ T;
}
-Complex :: struct { x, y: f32; }
-#match io.write (w: ^io.Writer, c: Complex) {
- io.write_format(w, "{.2} + {.2}i", c.x, c.y);
+Complex :: struct [conv.Custom_Format.{ format }] {
+ x, y: f32;
+
+ format :: (output: ^conv.Format_Output, format: ^conv.Format, c: ^Complex) {
+ conv.format(output, "{.2} + {.2}i", c.x, c.y);
+ }
}
#operator + (c1, c2: Complex) => Complex.{ c1.x + c2.x, c1.y + c2.y };