From dafb3daa12160c85639fedd3eacf5aaf51127c53 Mon Sep 17 00:00:00 2001 From: Julien Tant Date: Wed, 19 Jun 2024 01:43:52 -0700 Subject: Add an `Iff` helper (#172) I ran into some situation where I want to conditionally render a node if some variable is not nil and obviously I got a panic ```go // package viewmodels type SomePage struct { s *string } // package views func SomePage (vm viewmodels.SomePage) g,Node { return Div( If(vm.s == nil, Text("s is nil"), If(vm.s !- nil, Text("s is " + vm.s), // this will panic when `s` is nil ) } ``` In this situation, go will interpret the code of the second `if` regardless of the condition because the code itself is not in a condition. This PR introduces a new `Iff` helper that accepts a callback. The callback content is only interpreted when it's called, making the code safe: ```go // package viewmodels type SomePage struct { s *string } // package views func SomePage (vm viewmodels.SomePage) g,Node { return Div( Iff(vm.s == nil, func () g.Node { return Text("s is nil") }, Iff(vm.s !- nil, func () g.Node { return Text("s is " + vm.s) }, ) } ``` I'm aware of the `Lazy` effort on the side, but I guess this is no a breaking change and can still exist in addition to the `Lazy` effort. Co-authored-by: Markus Wüstenberg --- gomponents_test.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'gomponents_test.go') diff --git a/gomponents_test.go b/gomponents_test.go index 32304f3..df5da4f 100644 --- a/gomponents_test.go +++ b/gomponents_test.go @@ -284,3 +284,32 @@ func ExampleIf() { _ = e.Render(os.Stdout) // Output:
You lost your hat!
} + +func TestIff(t *testing.T) { + t.Run("returns node if condition is true", func(t *testing.T) { + n := g.El("div", g.Iff(true, func() g.Node { + return g.El("span") + })) + assert.Equal(t, "
", n) + }) + + t.Run("returns nil if condition is false", func(t *testing.T) { + n := g.El("div", g.Iff(false, func() g.Node { + return g.El("span") + })) + assert.Equal(t, "
", n) + }) +} + +func ExampleIff() { + var nillableVariable *struct { + str string + } + e := g.El("div", + g.Iff(nillableVariable != nil, func() g.Node { + return g.Text(nillableVariable.str) + }), + ) + _ = e.Render(os.Stdout) + // Output:
+} -- cgit 1.4.1