// +build !go1.5 package inspect import ( "bytes" "encoding/json" "fmt" "strings" ) // tryeRawInspectFallback executes the inspect template with a raw interface. // This allows docker cli to parse inspect structs injected with Swarm fields. // Unfortunately, go 1.4 doesn't fail executing invalid templates when the input is an interface. // It doesn't allow to modify this behavior either, sending messages to the output. // We assume that the template is invalid when there is a , if the template was valid // we'd get or "" values. In that case we fail with the original error raised executing the // template with the typed input. func (i *TemplateInspector) tryRawInspectFallback(rawElement []byte, originalErr error) error { var raw interface{} buffer := new(bytes.Buffer) rdr := bytes.NewReader(rawElement) dec := json.NewDecoder(rdr) if rawErr := dec.Decode(&raw); rawErr != nil { return fmt.Errorf("unable to read inspect data: %v", rawErr) } if rawErr := i.tmpl.Execute(buffer, raw); rawErr != nil { return fmt.Errorf("Template parsing error: %v", rawErr) } if strings.Contains(buffer.String(), "") { return fmt.Errorf("Template parsing error: %v", originalErr) } i.buffer.Write(buffer.Bytes()) i.buffer.WriteByte('\n') return nil }