mirror of
https://github.com/golang/go
synced 2024-11-22 19:24:59 -07:00
regexp: add Regexp.TextMarshaler/TextUnmarshaler
Fixes #46159 Change-Id: I51dc4e9e8915ab5a73f053690fb2395edbeb1151 Reviewed-on: https://go-review.googlesource.com/c/go/+/479401 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
da2755b472
commit
313ce55a86
2
api/next/46159.txt
Normal file
2
api/next/46159.txt
Normal file
@ -0,0 +1,2 @@
|
||||
pkg regexp, method (*Regexp) MarshalText() ([]uint8, error) #46159
|
||||
pkg regexp, method (*Regexp) UnmarshalText([]uint8) error #46159
|
@ -947,3 +947,29 @@ func TestMinInputLen(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestUnmarshalText(t *testing.T) {
|
||||
unmarshaled := new(Regexp)
|
||||
for i := range goodRe {
|
||||
re := compileTest(t, goodRe[i], "")
|
||||
marshaled, err := re.MarshalText()
|
||||
if err != nil {
|
||||
t.Errorf("regexp %#q failed to marshal: %s", re, err)
|
||||
continue
|
||||
}
|
||||
if err := unmarshaled.UnmarshalText(marshaled); err != nil {
|
||||
t.Errorf("regexp %#q failed to unmarshal: %s", re, err)
|
||||
continue
|
||||
}
|
||||
if unmarshaled.String() != goodRe[i] {
|
||||
t.Errorf("UnmarshalText returned unexpected value: %s", unmarshaled.String())
|
||||
}
|
||||
}
|
||||
t.Run("invalid pattern", func(t *testing.T) {
|
||||
re := new(Regexp)
|
||||
err := re.UnmarshalText([]byte(`\`))
|
||||
if err == nil {
|
||||
t.Error("unexpected success")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -1283,3 +1283,24 @@ func (re *Regexp) Split(s string, n int) []string {
|
||||
|
||||
return strings
|
||||
}
|
||||
|
||||
// MarshalText implements the encoding.TextMarshaler interface. The output
|
||||
// matches that of calling the [Regexp.String] method.
|
||||
//
|
||||
// Note that the output is lossy in some cases: This method does not indicate
|
||||
// POSIX regular expressions (i.e. those compiled by calling CompilePOSIX), or
|
||||
// those for which the [Regexp.Longest] method has been called.
|
||||
func (re *Regexp) MarshalText() ([]byte, error) {
|
||||
return []byte(re.String()), nil
|
||||
}
|
||||
|
||||
// MarshalText implements the encoding.TextUnmarshaler interface by calling
|
||||
// Compile on the encoded value.
|
||||
func (re *Regexp) UnmarshalText(text []byte) error {
|
||||
newRE, err := Compile(string(text))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*re = *newRE
|
||||
return nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user