diff --git a/picfg/pimodel/revcode.go b/picfg/pimodel/revcode.go index 6fe73ddfccd87644a323f647e4554bf438d1cf33..2983157533b867afbb5ac8fc63ae06da56047a83 100644 --- a/picfg/pimodel/revcode.go +++ b/picfg/pimodel/revcode.go @@ -67,6 +67,23 @@ func (code RevisionCode) String() string { return fmt.Sprintf("%06x", uint(code)) } +// MarshalText implements encoding.TextMarshaler. +func (revCode RevisionCode) MarshalText() ([]byte, error) { + return []byte(revCode.String()), nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. +func (revCode *RevisionCode) UnmarshalText(text []byte) error { + n, err := strconv.ParseUint(string(text), 0, 32) + if err != nil { + return err + } + + *revCode = RevisionCode(n) + + return nil +} + // newFlag returns true if the revision code uses new-style format. func (code RevisionCode) newFlag() bool { return (code>>newFlagShift)&newFlagMask == 1 diff --git a/picfg/pimodel/revcode_test.go b/picfg/pimodel/revcode_test.go index 9464de7885c32d0da2993555192f3c19aeb3594a..35647bdff22d0c073e2ee4060049fe3675672f44 100644 --- a/picfg/pimodel/revcode_test.go +++ b/picfg/pimodel/revcode_test.go @@ -22,6 +22,29 @@ func (s *revCodeSuite) TestString(c *C) { c.Check(pimodel.RevisionCode(0xa03140).String(), Equals, "a03140") } +func (s *revCodeSuite) TestMarshalText(c *C) { + revCode := pimodel.RevisionCode(0x0004) + data, err := revCode.MarshalText() + c.Assert(err, IsNil) + c.Check(data, DeepEquals, []byte("0004")) + + revCode = pimodel.RevisionCode(0xa03140) + data, err = revCode.MarshalText() + c.Assert(err, IsNil) + c.Check(data, DeepEquals, []byte("a03140")) +} + +func (s *revCodeSuite) TestUnmarshalText(c *C) { + var revCode pimodel.RevisionCode + + err := revCode.UnmarshalText([]byte("0004")) + c.Assert(err, IsNil) + c.Check(revCode, Equals, pimodel.RevisionCode(0x0004)) + + err = revCode.UnmarshalText([]byte("potato")) + c.Assert(err, ErrorMatches, `strconv.ParseUint: parsing "potato": invalid syntax`) +} + func (s *revCodeSuite) TestKnownRevisionCodes(c *C) { for _, t := range []struct { code pimodel.RevisionCode