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