mirror of
https://github.com/odin-lang/Odin.git
synced 2026-05-02 02:54:41 +00:00
Add JSON5/SJSON Comments When Marshalling
Allows user-facing JSON5/SJSON to have comments explaining field usage. `json.Marshal_Options.pretty` must be enabled since we only use single-line comments (not to mention it wouldn't be terribly useful without `pretty` set anyways). We don't escape anything, so `\n` will display as "\n", but you're still able to enter in a proper newline character and it'll be displayed on multiple lines.
This commit is contained in:
@@ -413,6 +413,12 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err:
|
||||
}
|
||||
|
||||
opt_write_iteration(w, opt, first_iteration) or_return
|
||||
|
||||
if opt.pretty {
|
||||
comment := reflect.struct_tag_get(reflect.Struct_Tag(info.tags[i]), "jsoncomment")
|
||||
opt_write_comment(w, opt, &comment) or_return
|
||||
}
|
||||
|
||||
first_iteration = false
|
||||
if json_name != "" {
|
||||
opt_write_key(w, opt, json_name) or_return
|
||||
@@ -533,6 +539,26 @@ marshal_to_writer :: proc(w: io.Writer, v: any, opt: ^Marshal_Options) -> (err:
|
||||
return
|
||||
}
|
||||
|
||||
// Newlines are split into multiple comment lines
|
||||
opt_write_comment :: proc(w: io.Writer, opt: ^Marshal_Options, comment: ^string) -> (err: io.Error) {
|
||||
if comment^ == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
switch opt.spec {
|
||||
case .JSON5, .MJSON:
|
||||
for line in strings.split_iterator(comment, "\n") {
|
||||
io.write_string(w, "// ") or_return
|
||||
io.write_string(w, line) or_return
|
||||
io.write_rune(w, '\n') or_return
|
||||
opt_write_indentation(w, opt) or_return
|
||||
}
|
||||
case .JSON: return nil
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// write key as quoted string or with optional quotes in mjson
|
||||
opt_write_key :: proc(w: io.Writer, opt: ^Marshal_Options, name: string) -> (err: io.Error) {
|
||||
switch opt.spec {
|
||||
|
||||
Reference in New Issue
Block a user