Commit 8802b188 authored by Rajath Agasthya's avatar Rajath Agasthya Committed by Rob Pike

fmt: Implement pp.WriteString method

This allows io.WriteString to make use of WriteString method
implemented by pp when writing a string to fmt.State.

Fixes #20786

Change-Id: Ice7a92bf303127ad87f05562217fa076f5c589ad
Reviewed-on: https://go-review.googlesource.com/61430Reviewed-by: default avatarRob Pike <r@golang.org>
parent fb54abe9
...@@ -131,6 +131,19 @@ func (byteFormatter) Format(f State, _ rune) { ...@@ -131,6 +131,19 @@ func (byteFormatter) Format(f State, _ rune) {
var byteFormatterSlice = []byteFormatter{'h', 'e', 'l', 'l', 'o'} var byteFormatterSlice = []byteFormatter{'h', 'e', 'l', 'l', 'o'}
// Copy of io.stringWriter interface used by writeStringFormatter for type assertion.
type stringWriter interface {
WriteString(s string) (n int, err error)
}
type writeStringFormatter string
func (sf writeStringFormatter) Format(f State, c rune) {
if sw, ok := f.(stringWriter); ok {
sw.WriteString("***" + string(sf) + "***")
}
}
var fmtTests = []struct { var fmtTests = []struct {
fmt string fmt string
val interface{} val interface{}
...@@ -977,6 +990,11 @@ var fmtTests = []struct { ...@@ -977,6 +990,11 @@ var fmtTests = []struct {
// This next case seems wrong, but the docs say the Formatter wins here. // This next case seems wrong, but the docs say the Formatter wins here.
{"%#v", byteFormatterSlice, "[]fmt_test.byteFormatter{X, X, X, X, X}"}, {"%#v", byteFormatterSlice, "[]fmt_test.byteFormatter{X, X, X, X, X}"},
// pp.WriteString
{"%s", writeStringFormatter(""), "******"},
{"%s", writeStringFormatter("xyz"), "***xyz***"},
{"%s", writeStringFormatter("⌘/⌘"), "***⌘/⌘***"},
// reflect.Value handled specially in Go 1.5, making it possible to // reflect.Value handled specially in Go 1.5, making it possible to
// see inside non-exported fields (which cannot be accessed with Interface()). // see inside non-exported fields (which cannot be accessed with Interface()).
// Issue 8965. // Issue 8965.
......
...@@ -172,6 +172,13 @@ func (p *pp) Write(b []byte) (ret int, err error) { ...@@ -172,6 +172,13 @@ func (p *pp) Write(b []byte) (ret int, err error) {
return len(b), nil return len(b), nil
} }
// Implement WriteString so that we can call io.WriteString
// on a pp (through state), for efficiency.
func (p *pp) WriteString(s string) (ret int, err error) {
p.buf.WriteString(s)
return len(s), nil
}
// These routines end in 'f' and take a format string. // These routines end in 'f' and take a format string.
// Fprintf formats according to a format specifier and writes to w. // Fprintf formats according to a format specifier and writes to w.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment