@@ -17,8 +17,10 @@ limitations under the License.
1717package conversion
1818
1919import (
20+ "bytes"
2021 "encoding/json"
2122 "fmt"
23+ "io"
2224 "path"
2325)
2426
@@ -51,65 +53,79 @@ import (
5153// config files.
5254//
5355func (s * Scheme ) EncodeToVersion (obj interface {}, destVersion string ) (data []byte , err error ) {
56+ buff := & bytes.Buffer {}
57+ if err := s .EncodeToVersionStream (obj , destVersion , buff ); err != nil {
58+ return nil , err
59+ }
60+ return buff .Bytes (), nil
61+ }
62+
63+ func (s * Scheme ) EncodeToVersionStream (obj interface {}, destVersion string , stream io.Writer ) error {
5464 obj = maybeCopy (obj )
5565 v , _ := EnforcePtr (obj ) // maybeCopy guarantees a pointer
5666
5767 // Don't encode an object defined in the unversioned package, unless if the
5868 // destVersion is v1, encode it to v1 for backward compatibility.
5969 pkg := path .Base (v .Type ().PkgPath ())
6070 if pkg == "unversioned" && destVersion != "v1" {
61- return s .encodeUnversionedObject (obj )
71+ // TODO: convert this to streaming too
72+ data , err := s .encodeUnversionedObject (obj )
73+ if err != nil {
74+ return err
75+ }
76+ _ , err = stream .Write (data )
77+ return err
6278 }
6379
6480 if _ , registered := s .typeToVersion [v .Type ()]; ! registered {
65- return nil , fmt .Errorf ("type %v is not registered for %q and it will be impossible to Decode it, therefore Encode will refuse to encode it." , v .Type (), destVersion )
81+ return fmt .Errorf ("type %v is not registered for %q and it will be impossible to Decode it, therefore Encode will refuse to encode it." , v .Type (), destVersion )
6682 }
6783
6884 objVersion , objKind , err := s .ObjectVersionAndKind (obj )
6985 if err != nil {
70- return nil , err
86+ return err
7187 }
7288
7389 // Perform a conversion if necessary.
7490 if objVersion != destVersion {
7591 objOut , err := s .NewObject (destVersion , objKind )
7692 if err != nil {
77- return nil , err
93+ return err
7894 }
7995 flags , meta := s .generateConvertMeta (objVersion , destVersion , obj )
8096 err = s .converter .Convert (obj , objOut , flags , meta )
8197 if err != nil {
82- return nil , err
98+ return err
8399 }
84100 obj = objOut
85101 }
86102
87103 // ensure the output object name comes from the destination type
88104 _ , objKind , err = s .ObjectVersionAndKind (obj )
89105 if err != nil {
90- return nil , err
106+ return err
91107 }
92108
93109 // Version and Kind should be set on the wire.
94110 err = s .SetVersionAndKind (destVersion , objKind , obj )
95111 if err != nil {
96- return nil , err
112+ return err
97113 }
98114
99115 // To add metadata, do some simple surgery on the JSON.
100- data , err = json .Marshal ( obj )
101- if err != nil {
102- return nil , err
116+ encoder : = json .NewEncoder ( stream )
117+ if err := encoder . Encode ( obj ); err != nil {
118+ return err
103119 }
104120
105121 // Version and Kind should be blank in memory. Reset them, since it's
106122 // possible that we modified a user object and not a copy above.
107123 err = s .SetVersionAndKind ("" , "" , obj )
108124 if err != nil {
109- return nil , err
125+ return err
110126 }
111127
112- return data , nil
128+ return nil
113129}
114130
115131func (s * Scheme ) encodeUnversionedObject (obj interface {}) (data []byte , err error ) {
0 commit comments