podman
116 строк · 2.8 Кб
1// Copyright 2015 go-swagger maintainers
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package runtime
16
17import (
18"bytes"
19"encoding"
20"errors"
21"fmt"
22"io"
23"reflect"
24
25"github.com/go-openapi/swag"
26)
27
28// TextConsumer creates a new text consumer
29func TextConsumer() Consumer {
30return ConsumerFunc(func(reader io.Reader, data interface{}) error {
31if reader == nil {
32return errors.New("TextConsumer requires a reader") // early exit
33}
34
35buf := new(bytes.Buffer)
36_, err := buf.ReadFrom(reader)
37if err != nil {
38return err
39}
40b := buf.Bytes()
41
42// If the buffer is empty, no need to unmarshal it, which causes a panic.
43if len(b) == 0 {
44return nil
45}
46
47if tu, ok := data.(encoding.TextUnmarshaler); ok {
48err := tu.UnmarshalText(b)
49if err != nil {
50return fmt.Errorf("text consumer: %v", err)
51}
52
53return nil
54}
55
56t := reflect.TypeOf(data)
57if data != nil && t.Kind() == reflect.Ptr {
58v := reflect.Indirect(reflect.ValueOf(data))
59if t.Elem().Kind() == reflect.String {
60v.SetString(string(b))
61return nil
62}
63}
64
65return fmt.Errorf("%v (%T) is not supported by the TextConsumer, %s",
66data, data, "can be resolved by supporting TextUnmarshaler interface")
67})
68}
69
70// TextProducer creates a new text producer
71func TextProducer() Producer {
72return ProducerFunc(func(writer io.Writer, data interface{}) error {
73if writer == nil {
74return errors.New("TextProducer requires a writer") // early exit
75}
76
77if data == nil {
78return errors.New("no data given to produce text from")
79}
80
81if tm, ok := data.(encoding.TextMarshaler); ok {
82txt, err := tm.MarshalText()
83if err != nil {
84return fmt.Errorf("text producer: %v", err)
85}
86_, err = writer.Write(txt)
87return err
88}
89
90if str, ok := data.(error); ok {
91_, err := writer.Write([]byte(str.Error()))
92return err
93}
94
95if str, ok := data.(fmt.Stringer); ok {
96_, err := writer.Write([]byte(str.String()))
97return err
98}
99
100v := reflect.Indirect(reflect.ValueOf(data))
101if t := v.Type(); t.Kind() == reflect.Struct || t.Kind() == reflect.Slice {
102b, err := swag.WriteJSON(data)
103if err != nil {
104return err
105}
106_, err = writer.Write(b)
107return err
108}
109if v.Kind() != reflect.String {
110return fmt.Errorf("%T is not a supported type by the TextProducer", data)
111}
112
113_, err := writer.Write([]byte(v.String()))
114return err
115})
116}
117