From 0eb78b2b5713138d3f16844bbbda8f16c3317ec6 Mon Sep 17 00:00:00 2001 From: Zygmunt Krynicki <zygmunt.krynicki@huawei.com> Date: Fri, 20 Aug 2021 09:52:59 +0200 Subject: [PATCH] pimodel: implement text encoding on RevisionCode We would like to be able to express RevisionCode in ota.Config and this requires it to implement the TextMarshaler and TextUnmarshaler interface. Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@huawei.com> --- picfg/pimodel/revcode.go | 17 +++++++++++++++++ picfg/pimodel/revcode_test.go | 23 +++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/picfg/pimodel/revcode.go b/picfg/pimodel/revcode.go index 6fe73dd..2983157 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 9464de7..35647bd 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 -- GitLab