| // Copyright 2017, The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package cmp | |
| // defaultReporter implements the reporter interface. | |
| // | |
| // As Equal serially calls the PushStep, Report, and PopStep methods, the | |
| // defaultReporter constructs a tree-based representation of the compared value | |
| // and the result of each comparison (see valueNode). | |
| // | |
| // When the String method is called, the FormatDiff method transforms the | |
| // valueNode tree into a textNode tree, which is a tree-based representation | |
| // of the textual output (see textNode). | |
| // | |
| // Lastly, the textNode.String method produces the final report as a string. | |
| type defaultReporter struct { | |
| root *valueNode | |
| curr *valueNode | |
| } | |
| func (r *defaultReporter) PushStep(ps PathStep) { | |
| r.curr = r.curr.PushStep(ps) | |
| if r.root == nil { | |
| r.root = r.curr | |
| } | |
| } | |
| func (r *defaultReporter) Report(rs Result) { | |
| r.curr.Report(rs) | |
| } | |
| func (r *defaultReporter) PopStep() { | |
| r.curr = r.curr.PopStep() | |
| } | |
| // String provides a full report of the differences detected as a structured | |
| // literal in pseudo-Go syntax. String may only be called after the entire tree | |
| // has been traversed. | |
| func (r *defaultReporter) String() string { | |
| assert(r.root != nil && r.curr == nil) | |
| if r.root.NumDiff == 0 { | |
| return "" | |
| } | |
| ptrs := new(pointerReferences) | |
| text := formatOptions{}.FormatDiff(r.root, ptrs) | |
| resolveReferences(text) | |
| return text.String() | |
| } | |
| func assert(ok bool) { | |
| if !ok { | |
| panic("assertion failure") | |
| } | |
| } |