1 // Copyright 2018, The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE.md file.
8 "github.com/google/go-cmp/cmp"
11 type xformFilter struct{ xform cmp.Option }
13 func (xf xformFilter) filter(p cmp.Path) bool {
14 for _, ps := range p {
15 if t, ok := ps.(cmp.Transform); ok && t.Option() == xf.xform {
22 // AcyclicTransformer returns a Transformer with a filter applied that ensures
23 // that the transformer cannot be recursively applied upon its own output.
25 // An example use case is a transformer that splits a string by lines:
26 // AcyclicTransformer("SplitLines", func(s string) []string{
27 // return strings.Split(s, "\n")
30 // Had this been an unfiltered Transformer instead, this would result in an
31 // infinite cycle converting a string to []string to [][]string and so on.
32 func AcyclicTransformer(name string, xformFunc interface{}) cmp.Option {
33 xf := xformFilter{cmp.Transformer(name, xformFunc)}
34 return cmp.FilterPath(xf.filter, xf.xform)