diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 08:41:23 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-08-19 08:41:23 +0200 |
| commit | 063d4058346f7dc03eb0aa5ba394b9a872d3f1e3 (patch) | |
| tree | 93d1ff06c91affc6586c64dc0326460b675f9e9b /lib/render/emit_json.mli | |
| parent | 5828571fa31a0480838d1ede210002ab50768c64 (diff) | |
| download | colitur-063d4058346f7dc03eb0aa5ba394b9a872d3f1e3.tar.gz colitur-063d4058346f7dc03eb0aa5ba394b9a872d3f1e3.zip | |
feat(render): CSV and JSON emitters, and the published contract
Both consume the VIEW, not the kernel, so every emitter and every
template describe exactly the same fields -- there is one vocabulary,
not five.
CSV is RFC 4180: a field with a comma is quoted. That is live on real
data, not hypothetical -- 'St. Joseph, Spouse of the Bl. Virgin Mary'
would otherwise split into two columns.
JSON is hand-rolled because the dependency list is frozen and escaping
is the only subtlety. Control characters below 0x20 are \u-escaped per
RFC 8259 section 7.
There are no numbers in the view, deliberately: a consumer never has to
guess whether week is 2 or "2".
schema/day-v1.json pins the shape. Once a phone subscribes or a site
fetches this, it is a promise to strangers -- adding a field is minor,
renaming one means /v2/.
Diffstat (limited to 'lib/render/emit_json.mli')
| -rw-r--r-- | lib/render/emit_json.mli | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/lib/render/emit_json.mli b/lib/render/emit_json.mli new file mode 100644 index 0000000..91c8f48 --- /dev/null +++ b/lib/render/emit_json.mli @@ -0,0 +1,10 @@ +(* emit_json.mli *) +(** JSON writer. Hand-rolled: the dependency list is frozen (spec section 1), + and writing JSON is a page of code where escaping is the only subtlety. + Output shape is pinned by schema/day-v1.json, the published contract. *) + +(** RFC 8259 section 7, including \u-escaping of control characters below 0x20. + Returns the value WITH its surrounding quotes. Exposed for testing. *) +val escape_string : string -> string + +val year : Template.value -> string |
