From 1e39ca5b6c30acac4ff5b439b5ec1c27da8a8222 Mon Sep 17 00:00:00 2001 From: Felix Krause Date: Mon, 11 Jan 2016 19:12:55 +0100 Subject: [PATCH] Removed unneccessary mapMayHaveKeyObjects --- private/events.nim | 6 +- private/presenter.nim | 149 +++++++++++++++++++----------------------- yaml.nim | 10 +-- 3 files changed, 69 insertions(+), 96 deletions(-) diff --git a/private/events.nim b/private/events.nim index 8588f65..0b400d5 100644 --- a/private/events.nim +++ b/private/events.nim @@ -54,10 +54,8 @@ proc endDocEvent*(): YamlStreamEvent = result = YamlStreamEvent(kind: yamlEndDocument) proc startMapEvent*(tag: TagId = yTagQuestionMark, - anchor: AnchorId = yAnchorNone, - mayHaveKeyObjects: bool = true): YamlStreamEvent = - result = YamlStreamEvent(kind: yamlStartMap, mapTag: tag, mapAnchor: anchor, - mapMayHaveKeyObjects: mayHaveKeyObjects) + anchor: AnchorId = yAnchorNone): YamlStreamEvent = + result = YamlStreamEvent(kind: yamlStartMap, mapTag: tag, mapAnchor: anchor) proc endMapEvent*(): YamlStreamEvent = result = YamlStreamEvent(kind: yamlEndMap) diff --git a/private/presenter.nim b/private/presenter.nim index 1a3c06a..1d35f1d 100644 --- a/private/presenter.nim +++ b/private/presenter.nim @@ -6,11 +6,10 @@ type DumperState = enum - dBlockExplicitMapKey, dBlockExplicitMapValue, dBlockImplicitMapKey, - dBlockImplicitMapValue, dBlockSequenceItem, dFlowImplicitMapKey, - dFlowImplicitMapValue, dFlowExplicitMapKey, dFlowExplicitMapValue, - dFlowSequenceItem, dFlowImplicitMapStart, dFlowExplicitMapStart, - dFlowSequenceStart + dBlockExplicitMapKey, dBlockImplicitMapKey, dBlockMapValue, + dBlockSequenceItem, dFlowImplicitMapKey, dFlowMapValue, + dFlowExplicitMapKey, dFlowSequenceItem, + dFlowMapStart, dFlowSequenceStart proc needsEscaping(scalar: string): bool {.raises: [].} = scalar.len == 0 or @@ -40,56 +39,51 @@ template safeWrite(s: string or char) {.dirty.} = raise e proc startItem(target: Stream, style: YamlPresentationStyle, indentation: int, - state: var DumperState) {.raises: [YamlPresenterOutputError].} = + state: var DumperState, isObject: bool) + {.raises: [YamlPresenterOutputError].} = try: case state - of dBlockExplicitMapValue: + of dBlockMapValue: target.write('\x0A') target.write(repeat(' ', indentation)) - target.write("? ") - state = dBlockExplicitMapKey + if isObject or style == ypsCanonical: + target.write("? ") + state = dBlockExplicitMapKey + else: + state = dBlockImplicitMapKey of dBlockExplicitMapKey: target.write('\x0A') target.write(repeat(' ', indentation)) target.write(": ") - state = dBlockExplicitMapValue - of dBlockImplicitMapValue: - target.write('\x0A') - target.write(repeat(' ', indentation)) - state = dBlockImplicitMapKey + state = dBlockMapValue of dBlockImplicitMapKey: target.write(": ") - state = dBlockImplicitMapValue + state = dBlockMapValue of dFlowExplicitMapKey: target.write('\x0A') target.write(repeat(' ', indentation)) target.write(": ") - state = dFlowExplicitMapValue - of dFlowExplicitMapValue: - target.write(",\x0A") - target.write(repeat(' ', indentation)) - target.write("? ") - state = dFlowExplicitMapKey - of dFlowImplicitMapStart: - if style == ypsJson: - target.write("\x0A") - target.write(repeat(' ', indentation)) - state = dFlowImplicitMapKey - of dFlowExplicitMapStart: - target.write('\x0A') - target.write(repeat(' ', indentation)) - target.write("? ") - state = dFlowExplicitMapKey - of dFlowImplicitMapKey: - target.write(": ") - state = dFlowImplicitMapValue - of dFlowImplicitMapValue: - if style == ypsJson: - target.write(",\x0A") - target.write(repeat(' ', indentation)) + state = dFlowMapValue + of dFlowMapValue: + if isObject or style in [ypsJson, ypsCanonical]: + target.write(",\x0A" & repeat(' ', indentation)) + if style != ypsJson: + target.write("? ") + state = dFlowExplicitMapKey else: target.write(", ") - state = dFlowImplicitMapKey + state = dFlowImplicitMapKey + of dFlowMapStart: + if isObject or style in [ypsJson, ypsCanonical]: + target.write("\x0A" & repeat(' ', indentation)) + if style != ypsJson: + target.write("? ") + state = dFlowExplicitMapKey + else: + state = dFlowImplicitMapKey + of dFlowImplicitMapKey: + target.write(": ") + state = dFlowMapValue of dBlockSequenceItem: target.write('\x0A') target.write(repeat(' ', indentation)) @@ -185,7 +179,8 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, if style != ypsJson: safeWrite('\x0A') else: - startItem(target, style, indentation, levels[levels.high]) + startItem(target, style, indentation, levels[levels.high], + false) if style != ypsJson: writeTagAndAnchor(target, item.scalarTag, tagLib, item.scalarAnchor) @@ -218,7 +213,7 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, safeWrite(item.scalarContent) of yamlAlias: assert levels.len > 0 - startItem(target, style, indentation, levels[levels.high]) + startItem(target, style, indentation, levels[levels.high], false) try: target.write('*') target.write(cast[byte]('a') + cast[byte](item.aliasTarget)) @@ -254,7 +249,7 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, dBlockSequenceItem of ypsJson: if levels.len > 0 and levels[levels.high] in - [dFlowImplicitMapStart, dFlowImplicitMapValue]: + [dFlowMapStart, dFlowMapValue]: raise newException(YamlPresenterJsonError, "Cannot have sequence as map key in JSON output!") nextState = dFlowSequenceStart @@ -275,7 +270,7 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, safeWrite('\x0A') indentation += indentationStep else: - startItem(target, style, indentation, levels[levels.high]) + startItem(target, style, indentation, levels[levels.high], true) if style != ypsJson: writeTagAndAnchor(target, item.seqTag, tagLib, item.seqAnchor) @@ -285,9 +280,8 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, safeWrite('[') if levels.len > 0 and style in [ypsJson, ypsCanonical] and levels[levels.high] in - [dBlockExplicitMapKey, dBlockExplicitMapValue, - dBlockImplicitMapKey, dBlockImplicitMapValue, - dBlockSequenceItem]: + [dBlockExplicitMapKey, dBlockMapValue, + dBlockImplicitMapKey, dBlockSequenceItem]: indentation += indentationStep levels.add(nextState) of yamlStartMap: @@ -314,27 +308,21 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, var e = newException(YamlPresenterStreamError, "") e.cause = getCurrentException() raise e - nextState = if length <= 60: dFlowImplicitMapStart else: - if item.mapMayHaveKeyObjects: - dBlockExplicitMapValue else: dBlockImplicitMapValue + nextState = if length <= 60: dFlowMapStart else: dBlockMapValue of ypsMinimal: - nextState = if item.mapMayHaveKeyObjects: - dFlowExplicitMapStart else: dFlowImplicitMapStart + nextState = dFlowMapStart of ypsCanonical: - nextState = dFlowExplicitMapStart + nextState = dFlowMapStart of ypsJson: if levels.len > 0 and levels[levels.high] in - [dFlowImplicitMapStart, dFlowImplicitMapValue]: + [dFlowMapStart, dFlowMapValue]: raise newException(YamlPresenterJsonError, "Cannot have map as map key in JSON output!") - nextState = dFlowImplicitMapStart + nextState = dFlowMapStart of ypsBlockOnly: - nextState = if item.mapMayHaveKeyObjects: - dBlockExplicitMapValue else: dBlockImplicitMapValue - + nextState = dBlockMapValue if levels.len == 0: - if nextState in - [dBlockExplicitMapValue, dBlockImplicitMapValue]: + if nextState == dBlockMapValue: if style != ypsJson: writeTagAndAnchor(target, item.mapTag, tagLib, item.mapAnchor) @@ -345,27 +333,26 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, item.mapTag, tagLib, item.mapAnchor) indentation += indentationStep else: - if nextState in - [dBlockExplicitMapValue, dBlockImplicitMapValue, - dBlockImplicitMapKey]: + if nextState in [dBlockMapValue, dBlockImplicitMapKey]: if style != ypsJson: writeTagAndAnchor(target, item.mapTag, tagLib, item.mapAnchor) - startItem(target, style, indentation, levels[levels.high]) + startItem(target, style, indentation, levels[levels.high], + true) else: - startItem(target, style, indentation, levels[levels.high]) + startItem(target, style, indentation, levels[levels.high], + true) if style != ypsJson: writeTagAndAnchor(target, item.mapTag, tagLib, item.mapAnchor) indentation += indentationStep - if nextState in [dFlowImplicitMapStart, dFlowExplicitMapStart]: + if nextState == dFlowMapStart: safeWrite('{') if levels.len > 0 and style in [ypsJson, ypsCanonical] and levels[levels.high] in - [dBlockExplicitMapKey, dBlockExplicitMapValue, - dBlockImplicitMapKey, dBlockImplicitMapValue, - dBlockSequenceItem]: + [dBlockExplicitMapKey, dBlockMapValue, + dBlockImplicitMapKey, dBlockSequenceItem]: indentation += indentationStep levels.add(nextState) @@ -387,16 +374,14 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, e.cause = getCurrentException() raise e if levels.len == 0 or levels[levels.high] notin - [dBlockExplicitMapKey, dBlockExplicitMapValue, - dBlockImplicitMapKey, dBlockImplicitMapValue, - dBlockSequenceItem]: + [dBlockExplicitMapKey, dBlockMapValue, + dBlockImplicitMapKey, dBlockSequenceItem]: continue of dFlowSequenceStart: if levels.len > 0 and style in [ypsJson, ypsCanonical] and levels[levels.high] in - [dBlockExplicitMapKey, dBlockExplicitMapValue, - dBlockImplicitMapKey, dBlockImplicitMapValue, - dBlockSequenceItem]: + [dBlockExplicitMapKey, dBlockMapValue, + dBlockImplicitMapKey, dBlockSequenceItem]: indentation -= indentationStep safeWrite(']') of dBlockSequenceItem: @@ -407,7 +392,7 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, of yamlEndMap: assert levels.len > 0 case levels.pop() - of dFlowImplicitMapValue, dFlowExplicitMapValue: + of dFlowMapValue: case style of ypsDefault, ypsMinimal, ypsBlockOnly: safeWrite('}') @@ -422,19 +407,17 @@ proc present*(s: YamlStream, target: Stream, tagLib: YamlTagLibrary, e.cause = getCurrentException() raise e if levels.len == 0 or levels[levels.high] notin - [dBlockExplicitMapKey, dBlockExplicitMapValue, - dBlockImplicitMapKey, dBlockImplicitMapValue, - dBlockSequenceItem]: + [dBlockExplicitMapKey, dBlockMapValue, + dBlockImplicitMapKey, dBlockSequenceItem]: continue - of dFlowImplicitMapStart, dFlowExplicitMapStart: + of dFlowMapStart: if levels.len > 0 and style in [ypsJson, ypsCanonical] and levels[levels.high] in - [dBlockExplicitMapKey, dBlockExplicitMapValue, - dBlockImplicitMapKey, dBlockImplicitMapValue, - dBlockSequenceItem]: + [dBlockExplicitMapKey, dBlockMapValue, + dBlockImplicitMapKey, dBlockSequenceItem]: indentation -= indentationStep safeWrite('}') - of dBlockImplicitMapValue, dBlockExplicitMapValue: + of dBlockMapValue: discard else: assert false diff --git a/yaml.nim b/yaml.nim index 0d610a4..441ca52 100644 --- a/yaml.nim +++ b/yaml.nim @@ -82,19 +82,12 @@ type ## ``yTagQuestionMark`` and ``yTagExclamationMark`` respectively. ## Mapping is done by a `YamlTagLibrary <#YamlTagLibrary>`_. ## - ## The value ``mapMayHaveKeyObjects`` is a hint from a serializer and is - ## used for choosing an appropriate presentation mode for a YAML map - ## (flow or block, explicit or implicit) by - ## `present <#present,YamlStream,Stream,YamlTagLibrary,YamlDumpStyle,int>`_. - ## If it is set to ``false``, the map may only have scalars as keys. - ## ## The value ``scalarType`` is a hint from the lexer, see ## `YamlTypeHint <#YamlTypeHint>`_. case kind*: YamlStreamEventKind of yamlStartMap: mapAnchor* : AnchorId mapTag* : TagId - mapMayHaveKeyObjects* : bool of yamlStartSequence: seqAnchor* : AnchorId seqTag* : TagId @@ -310,8 +303,7 @@ proc `$`*(event: YamlStreamEvent): string proc startDocEvent*(): YamlStreamEvent {.inline.} proc endDocEvent*(): YamlStreamEvent {.inline.} proc startMapEvent*(tag: TagId = yTagQuestionMark, - anchor: AnchorId = yAnchorNone, - mayHaveKeyObjects: bool = true): YamlStreamEvent {.inline.} + anchor: AnchorId = yAnchorNone): YamlStreamEvent {.inline.} proc endMapEvent*(): YamlStreamEvent {.inline.} proc startSeqEvent*(tag: TagId = yTagQuestionMark, anchor: AnchorId = yAnchorNone): YamlStreamEvent {.inline.}