You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: info.go
    path of file: ./repos/docker-ce/components/cli/cli/command/system
    
    the code of the file until where you have to start completion: package system

import (
	"context"
	"fmt"
	"io"
	"io/ioutil"
	"regexp"
	"sort"
	"strings"

	"github.com/docker/cli/cli"
	pluginmanager "github.com/docker/cli/cli-plugins/manager"
	"github.com/docker/cli/cli/command"
	"github.com/docker/cli/cli/debug"
	"github.com/docker/cli/templates"
	"github.com/docker/docker
    
func needsServerInfo(template string, info info) bool {
	if len(template) == 0 || placeHolders.FindString(template) == "" {
		// The template is empty, or does not contain formatting fields
		// (e.g. `table` or `raw` or `{{ json .}}`). Assume we need server-side
		// information to render it.
		return true
	}

	// A template is provided and has at least one field set.
	tmpl, err := templates.NewParse("", template)
	if err != nil {
		// ignore parsing errors here, and let regular code handle them
		return true
	}

	type sparseInfo struct {
		ClientInfo   *clientInfo `json:",omitempty"`
		ClientErrors []string    `json:",omitempty"`
	}

	// This constructs an "info" object that only has the client-side fields.
	err = tmpl.Execute(ioutil.Discard, sparseInfo{
		ClientInfo:   info.ClientInfo,
		ClientErrors: info.ClientErrors,
	})
	// If executing the template failed, it means the template needs
	// server-side information as well. If it succeeded without server-side
	// information, we don't need to make API calls to collect that information.
	return err != nil
}