]> Cypherpunks.ru repositories - gostls13.git/commitdiff
regexp: add Regexp.TextMarshaler/TextUnmarshaler
authorJonathan Hall <flimzy@flimzy.com>
Mon, 27 Mar 2023 11:23:36 +0000 (13:23 +0200)
committerGopher Robot <gobot@golang.org>
Wed, 12 Apr 2023 20:03:09 +0000 (20:03 +0000)
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>

api/next/46159.txt [new file with mode: 0644]
src/regexp/all_test.go
src/regexp/regexp.go

diff --git a/api/next/46159.txt b/api/next/46159.txt
new file mode 100644 (file)
index 0000000..183cd07
--- /dev/null
@@ -0,0 +1,2 @@
+pkg regexp, method (*Regexp) MarshalText() ([]uint8, error) #46159
+pkg regexp, method (*Regexp) UnmarshalText([]uint8) error #46159
index 52de3fef83da514f25f404072e7cb8ce8f0a13da..124313d1af970e5a16396253cd2f352a126c83c5 100644 (file)
@@ -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")
+               }
+       })
+}
index 990c06e89132b00771aa563067be464e4ea38878..82023868ec125af59d0eb5e13e9e7b28be15aa5c 100644 (file)
@@ -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
+}