func buildContainerListOptions(opts *psOptions) (*types.ContainerListOptions, error) { options := &types.ContainerListOptions{ All: opts.all, Limit: opts.last, Size: opts.size, Filters: opts.filter.Value(), } if opts.nLatest && opts.last == -1 { options.Limit = 1 } tmpl, err := templates.Parse(opts.format) if err != nil { return nil, err } optionsProcessor := listOptionsProcessor{} // This shouldn't error out but swallowing the error makes it harder // to track down if preProcessor issues come up. Ref #24696 if err := tmpl.Execute(ioutil.Discard, optionsProcessor); err != nil { return nil, err } // At the moment all we need is to capture .Size for preprocessor options.Size = opts.size || optionsProcessor["size"] return options, nil }
func (c *Context) parseFormat() (*template.Template, error) { tmpl, err := templates.Parse(c.finalFormat) if err != nil { return tmpl, fmt.Errorf("Template parsing error: %v\n", err) } return tmpl, err }
func formatInfo(dockerCli *command.DockerCli, info types.Info, format string) error { tmpl, err := templates.Parse(format) if err != nil { return cli.StatusError{StatusCode: 64, Status: "Template parsing error: " + err.Error()} } err = tmpl.Execute(dockerCli.Out(), info) dockerCli.Out().Write([]byte{'\n'}) return err }
func runVersion(dockerCli *command.DockerCli, opts *versionOptions) error { ctx := context.Background() templateFormat := versionTemplate if opts.format != "" { templateFormat = opts.format } tmpl, err := templates.Parse(templateFormat) if err != nil { return cli.StatusError{StatusCode: 64, Status: "Template parsing error: " + err.Error()} } APIVersion := dockerCli.Client().ClientVersion() if defaultAPIVersion := dockerCli.DefaultVersion(); APIVersion != defaultAPIVersion { APIVersion = fmt.Sprintf("%s (downgraded from %s)", APIVersion, defaultAPIVersion) } vd := types.VersionResponse{ Client: &types.Version{ Version: dockerversion.Version, APIVersion: APIVersion, GoVersion: runtime.Version(), GitCommit: dockerversion.GitCommit, BuildTime: dockerversion.BuildTime, Os: runtime.GOOS, Arch: runtime.GOARCH, }, } serverVersion, err := dockerCli.Client().ServerVersion(ctx) if err == nil { vd.Server = &serverVersion } // first we need to make BuildTime more human friendly t, errTime := time.Parse(time.RFC3339Nano, vd.Client.BuildTime) if errTime == nil { vd.Client.BuildTime = t.Format(time.ANSIC) } if vd.ServerOK() { t, errTime = time.Parse(time.RFC3339Nano, vd.Server.BuildTime) if errTime == nil { vd.Server.BuildTime = t.Format(time.ANSIC) } } if err2 := tmpl.Execute(dockerCli.Out(), vd); err2 != nil && err == nil { err = err2 } dockerCli.Out().Write([]byte{'\n'}) return err }
// NewTemplateInspectorFromString creates a new TemplateInspector from a string // which is compiled into a template. func NewTemplateInspectorFromString(out io.Writer, tmplStr string) (Inspector, error) { if tmplStr == "" { return NewIndentedInspector(out), nil } tmpl, err := templates.Parse(tmplStr) if err != nil { return nil, fmt.Errorf("Template parsing error: %s", err) } return NewTemplateInspector(out, tmpl), nil }
func makeTemplate(format string) (*template.Template, error) { if format == "" { return nil, nil } tmpl, err := templates.Parse(format) if err != nil { return tmpl, err } // we execute the template for an empty message, so as to validate // a bad template like "{{.badFieldString}}" return tmpl, tmpl.Execute(ioutil.Discard, &eventtypes.Message{}) }
func TestTemplateInspectorEmpty(t *testing.T) { b := new(bytes.Buffer) tmpl, err := templates.Parse("{{.DNS}}") if err != nil { t.Fatal(err) } i := NewTemplateInspector(b, tmpl) if err := i.Flush(); err != nil { t.Fatal(err) } if b.String() != "\n" { t.Fatalf("Expected `\\n`, got `%s`", b.String()) } }
func TestTemplateInspectorRawFallbackError(t *testing.T) { b := new(bytes.Buffer) tmpl, err := templates.Parse("{{.Dns}}") if err != nil { t.Fatal(err) } i := NewTemplateInspector(b, tmpl) err = i.Inspect(testElement{"0.0.0.0"}, []byte(`{"Foo": "0.0.0.0"}`)) if err == nil { t.Fatal("Expected error got nil") } if !strings.HasPrefix(err.Error(), "Template parsing error") { t.Fatalf("Expected template error, got %v", err) } }
func TestTemplateInspectorRawFallback(t *testing.T) { b := new(bytes.Buffer) tmpl, err := templates.Parse("{{.Dns}}") if err != nil { t.Fatal(err) } i := NewTemplateInspector(b, tmpl) if err := i.Inspect(testElement{"0.0.0.0"}, []byte(`{"Dns": "0.0.0.0"}`)); err != nil { t.Fatal(err) } if err := i.Flush(); err != nil { t.Fatal(err) } if b.String() != "0.0.0.0\n" { t.Fatalf("Expected `0.0.0.0\\n`, got `%s`", b.String()) } }
func TestTemplateInspectorDefault(t *testing.T) { b := new(bytes.Buffer) tmpl, err := templates.Parse("{{.DNS}}") if err != nil { t.Fatal(err) } i := NewTemplateInspector(b, tmpl) if err := i.Inspect(testElement{"0.0.0.0"}, nil); err != nil { t.Fatal(err) } if err := i.Flush(); err != nil { t.Fatal(err) } if b.String() != "0.0.0.0\n" { t.Fatalf("Expected `0.0.0.0\\n`, got `%s`", b.String()) } }