From 02d2b9e4cc6e5457b30eb9492770418a04266ef4 Mon Sep 17 00:00:00 2001 From: Jooyung Han Date: Fri, 1 Dec 2023 13:53:54 +0900 Subject: [PATCH] Add a new util to clear a property proptools.Clear(ptr) clears a property with its zero value. Bug: 313806237 Test: m blueprint_tests Change-Id: Ib78f9f88a9b0a8b04e1ab6c5e545b55ba4269e5d --- proptools/proptools.go | 6 +++++ proptools/proptools_test.go | 46 ++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/proptools/proptools.go b/proptools/proptools.go index 6946d7e..4580d01 100644 --- a/proptools/proptools.go +++ b/proptools/proptools.go @@ -53,6 +53,12 @@ func FieldNameForProperty(propertyName string) string { return fieldName } +// Clear takes a pointer to a field and clears the value pointed to by the pointer with zero value. +func Clear[T any](ptr *T) { + var zeroValue T + *ptr = zeroValue +} + // BoolPtr returns a pointer to a new bool containing the given value. func BoolPtr(b bool) *bool { return &b diff --git a/proptools/proptools_test.go b/proptools/proptools_test.go index 207ee1b..0fa0507 100644 --- a/proptools/proptools_test.go +++ b/proptools/proptools_test.go @@ -14,7 +14,9 @@ package proptools -import "testing" +import ( + "testing" +) func TestPropertyNameForField(t *testing.T) { tests := []struct { @@ -112,3 +114,45 @@ func TestFieldNameForProperty(t *testing.T) { }) } } + +func TestClearField(t *testing.T) { + props := struct { + i int + s string + ps *string + ss []string + c struct { + n int + } + }{} + + props.i = 42 + Clear(&props.i) + if props.i != 0 { + t.Error("int field is not cleared to zero.") + } + + props.s = "foo" + Clear(&props.s) + if props.s != "" { + t.Error("string field is not cleared to zero.") + } + + props.ps = StringPtr("foo") + Clear(&props.ps) + if props.ps != nil { + t.Error("string pointer field is not cleared to zero.") + } + + props.ss = []string{"foo"} + Clear(&props.ss) + if props.ss != nil { + t.Error("string array field is not cleared to zero.") + } + + props.c.n = 42 + Clear(&props.c) + if props.c.n != 0 { + t.Error("struct field is not cleared to zero.") + } +}