From 195d152785e421af50186c475e654572fd9c5453 Mon Sep 17 00:00:00 2001 From: Nick Craig-Wood Date: Tue, 28 Apr 2020 12:49:19 +0100 Subject: [PATCH] rc: add GetStructMissingOK --- fs/rc/params.go | 10 ++++++++++ fs/rc/params_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/fs/rc/params.go b/fs/rc/params.go index 07855b16c..306786fda 100644 --- a/fs/rc/params.go +++ b/fs/rc/params.go @@ -202,3 +202,13 @@ func (p Params) GetStruct(key string, out interface{}) error { } return nil } + +// GetStructMissingOK works like GetStruct but doesn't return an error +// if the key is missing +func (p Params) GetStructMissingOK(key string, out interface{}) error { + _, ok := p[key] + if !ok { + return nil + } + return p.GetStruct(key, out) +} diff --git a/fs/rc/params_test.go b/fs/rc/params_test.go index bbca1385a..4b7a25349 100644 --- a/fs/rc/params_test.go +++ b/fs/rc/params_test.go @@ -249,3 +249,32 @@ func TestParamsGetStruct(t *testing.T) { assert.Equal(t, 4.2, out.Float) assert.Equal(t, true, IsErrParamInvalid(e3), e3.Error()) } + +func TestParamsGetStructMissingOK(t *testing.T) { + in := Params{ + "struct": Params{ + "String": "one", + "Float": 4.2, + }, + } + var out struct { + String string + Float float64 + } + e1 := in.GetStructMissingOK("struct", &out) + assert.NoError(t, e1) + assert.Equal(t, "one", out.String) + assert.Equal(t, 4.2, out.Float) + + e2 := in.GetStructMissingOK("notOK", &out) + assert.NoError(t, e2) + assert.Equal(t, "one", out.String) + assert.Equal(t, 4.2, out.Float) + + in["struct"] = "string" + e3 := in.GetStructMissingOK("struct", &out) + assert.Error(t, e3) + assert.Equal(t, "one", out.String) + assert.Equal(t, 4.2, out.Float) + assert.Equal(t, true, IsErrParamInvalid(e3), e3.Error()) +}