From df9152c3c5afd387cb2f6533a6636befc7935b13 Mon Sep 17 00:00:00 2001 From: Pavel Ivanov Date: Thu, 28 Oct 2021 00:55:08 +0300 Subject: [PATCH] new: TextMarshal and TextUnmarshal --- semver_test.go | 26 ++++++++++++++++++++++++++ v4/semver.go | 17 +++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/semver_test.go b/semver_test.go index baf10f8..501fc14 100644 --- a/semver_test.go +++ b/semver_test.go @@ -441,6 +441,32 @@ func TestFinalizeVersion(t *testing.T) { } } +func TestMarshalText(t *testing.T) { + for _, test := range formatTests { + res, err := test.v.MarshalText() + if err != nil { + t.Fatalf("Unexpected error %q", err) + } + if string(res) != test.result { + t.Errorf("MarshalText, expected %q but got %q", test.result, string(res)) + } + } +} + +func TestUnmarshalText(t *testing.T) { + for _, test := range formatTests { + var v Version + err := v.UnmarshalText([]byte(test.result)) + if err != nil { + t.Fatalf("Unexpected error %q", err) + } else if comp := v.Compare(test.v); comp != 0 { + t.Errorf("Parsing, expected %q but got %q, comp: %d ", test.v, v, comp) + } else if err := v.Validate(); err != nil { + t.Errorf("Error validating parsed version %q: %q", test.v, err) + } + } +} + func BenchmarkParseSimple(b *testing.B) { const VERSION = "0.0.1" b.ReportAllocs() diff --git a/v4/semver.go b/v4/semver.go index 307de61..b04fc6b 100644 --- a/v4/semver.go +++ b/v4/semver.go @@ -221,6 +221,23 @@ func (v Version) Validate() error { return nil } +// MarshalText implements the encoding.TextMarshaler interface. +func (v Version) MarshalText() ([]byte, error) { + return []byte(v.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface. +func (v *Version) UnmarshalText(data []byte) error { + value, err := Parse(string(data)) + if err != nil { + return err + } + + *v = value + + return nil +} + // New is an alias for Parse and returns a pointer, parses version string and returns a validated Version or error func New(s string) (*Version, error) { v, err := Parse(s)