Looping over embedded structs in html template

Tue, Nov 28, 2023 2-minute read

Looping over embedded structs in html template

I am using the slack-go package and needed to pull out information from slacks Conversations API.

slack-go uses the following structs to store this data:

// Channel contains information about the channel
type Channel struct {
	GroupConversation
	IsChannel bool   `json:"is_channel"`
	IsGeneral bool   `json:"is_general"`
	IsMember  bool   `json:"is_member"`
	Locale    string `json:"locale"`
}
// GroupConversation is the foundation for Group and Channel
type GroupConversation struct {
	Conversation
	Name       string   `json:"name"`
	Creator    string   `json:"creator"`
	IsArchived bool     `json:"is_archived"`
	Members    []string `json:"members"`
	Topic      Topic    `json:"topic"`
	Purpose    Purpose  `json:"purpose"`
}

Getting the conversation is easy;

s := slack.New(botToken)
	channels, _, _ := s.GetConversationsContext(ctx, &slack.GetConversationsParameters{
		TeamID: "id",
	})

And it returns []slack.Channel

In a html template I wanted to get all the available channels and put them into a <select>. It took a long time before I realised that GroupConversation is an embedded struct and thus you cannot reference it by a struct value.

To get the GroupConversation.Name from a slice of Channel in .tmpl I used the following loop:

<select class="select select-bordered w-full max-w-xs">
    <option disabled selected>Slack Channel</option>
      {{with .Channels}}
          {{range .}}
            <option>{{.Name}}</option>
          {{end}}
      {{end}}
  </select>

The {{ range . }} seems a little off putting to me; magical even. But, it works. I’m hoping there is a better way but this works quite well for now.

Tags:

#TIL #go