(i interface{}, b *bytes.Buffer)
| 347 | } |
| 348 | |
| 349 | func layerGoString(i interface{}, b *bytes.Buffer) { |
| 350 | if s, ok := i.(fmt.GoStringer); ok { |
| 351 | b.WriteString(s.GoString()) |
| 352 | return |
| 353 | } |
| 354 | |
| 355 | var v reflect.Value |
| 356 | var ok bool |
| 357 | if v, ok = i.(reflect.Value); !ok { |
| 358 | v = reflect.ValueOf(i) |
| 359 | } |
| 360 | switch v.Kind() { |
| 361 | case reflect.Ptr, reflect.Interface: |
| 362 | if v.Kind() == reflect.Ptr { |
| 363 | b.WriteByte('&') |
| 364 | } |
| 365 | layerGoString(v.Elem().Interface(), b) |
| 366 | case reflect.Struct: |
| 367 | t := v.Type() |
| 368 | b.WriteString(t.String()) |
| 369 | b.WriteByte('{') |
| 370 | for i := 0; i < v.NumField(); i++ { |
| 371 | if i > 0 { |
| 372 | b.WriteString(", ") |
| 373 | } |
| 374 | if t.Field(i).Name == "BaseLayer" { |
| 375 | fmt.Fprintf(b, "BaseLayer:%s", baseLayerString(v.Field(i))) |
| 376 | } else if v.Field(i).Kind() == reflect.Struct { |
| 377 | fmt.Fprintf(b, "%s:", t.Field(i).Name) |
| 378 | layerGoString(v.Field(i), b) |
| 379 | } else if v.Field(i).Kind() == reflect.Ptr { |
| 380 | b.WriteByte('&') |
| 381 | layerGoString(v.Field(i), b) |
| 382 | } else { |
| 383 | fmt.Fprintf(b, "%s:%#v", t.Field(i).Name, v.Field(i)) |
| 384 | } |
| 385 | } |
| 386 | b.WriteByte('}') |
| 387 | default: |
| 388 | fmt.Fprintf(b, "%#v", i) |
| 389 | } |
| 390 | } |
| 391 | |
| 392 | // LayerGoString returns a representation of the layer in Go syntax, |
| 393 | // taking care to shorten "very long" BaseLayer byte slices |
no test coverage detected
searching dependent graphs…