From 1c26bced61bfa5e992813e5d810ec7d1f4574c7a Mon Sep 17 00:00:00 2001 From: Ary Borenszweig Date: Tue, 16 Jul 2019 08:32:25 -0300 Subject: [PATCH] Add JSON::Builder#next_is_object_key? --- spec/std/json/builder_spec.cr | 14 ++++++++++++++ src/json/builder.cr | 7 +++++++ 2 files changed, 21 insertions(+) diff --git a/spec/std/json/builder_spec.cr b/spec/std/json/builder_spec.cr index 8e47c054c557..f09f26187f14 100644 --- a/spec/std/json/builder_spec.cr +++ b/spec/std/json/builder_spec.cr @@ -307,4 +307,18 @@ describe JSON::Builder do builder.start_object end end + + it "#next_is_object_key?" do + io = IO::Memory.new + builder = JSON::Builder.new(io) + builder.next_is_object_key?.should be_false + builder.start_document + builder.next_is_object_key?.should be_false + builder.start_object + builder.next_is_object_key?.should be_true + builder.scalar("foo") + builder.next_is_object_key?.should be_false + builder.scalar("bar") + builder.next_is_object_key?.should be_true + end end diff --git a/src/json/builder.cr b/src/json/builder.cr index 4e93b6633544..b5749c5c931a 100644 --- a/src/json/builder.cr +++ b/src/json/builder.cr @@ -280,6 +280,13 @@ class JSON::Builder end end + # Returns `true` if the next thing that must pushed into this + # builder is an object key (so a string) or the end of an object. + def next_is_object_key? : Bool + state = @state.last + state.is_a?(ObjectState) && state.name + end + private def scalar(string = false) start_scalar(string) yield.tap { end_scalar(string) }