@@ -88,8 +88,13 @@ function parse(variant) {
8888}
8989
9090function jsToMarshalFmt ( signature , value ) {
91- // TODO better error handling because this is called on user functions and
92- // they may have mismatched signature and value
91+ if ( value === undefined ) {
92+ throw new Error ( `expected value for signature: ${ signature } ` ) ;
93+ }
94+ if ( signature === undefined ) {
95+ throw new Error ( `expected signature for value: ${ value } ` ) ;
96+ }
97+
9398 let signatureStr = null ;
9499 if ( typeof signature === 'string' ) {
95100 signatureStr = signature ;
@@ -99,17 +104,23 @@ function jsToMarshalFmt(signature, value) {
99104 }
100105
101106 if ( signature . child . length === 0 ) {
102- if ( value . constructor === Variant ) {
103- return [ value . signature , value . value ] ;
107+ if ( signature . type === 'v' ) {
108+ if ( value . constructor !== Variant ) {
109+ throw new Error ( `expected a Variant for value (got ${ typeof value } )` ) ;
110+ }
111+ return [ signature . type , jsToMarshalFmt ( value . signature , value . value ) ] ;
104112 } else {
105- return [ signature . type , value ] ;
113+ return [ signature . type , value ] ;
106114 }
107115 }
108116
109117 if ( signature . type === 'a' ) {
110118 let result = [ ] ;
111119 if ( signature . child [ 0 ] . type === '{' ) {
112120 // this is an array of dictionary elements
121+ if ( value . constructor !== Object ) {
122+ throw new Error ( `expecting an object for signature '${ signatureStr } ' (got ${ typeof value } )` ) ;
123+ }
113124 for ( let k of Object . keys ( value ) ) {
114125 let v = value [ k ] ;
115126 if ( v . constructor === Variant ) {
@@ -119,6 +130,9 @@ function jsToMarshalFmt(signature, value) {
119130 }
120131 }
121132 } else {
133+ if ( ! Array . isArray ( value ) ) {
134+ throw new Error ( `expecting an array for signature '${ signatureStr } ' (got ${ typeof value } )` ) ;
135+ }
122136 for ( let v of value ) {
123137 if ( v . constructor === Variant ) {
124138 result . push ( jsToMarshalFmt ( v . signature , v . value ) ) ;
@@ -127,18 +141,29 @@ function jsToMarshalFmt(signature, value) {
127141 }
128142 }
129143 }
130- return [ collapseSignature ( signature ) , result ] ;
144+ return [ signatureStr , result ] ;
131145 } else if ( signature . type === '(' ) {
146+ if ( ! Array . isArray ( value ) ) {
147+ throw new Error ( `expecting an array for signature '${ signatureStr } ' (got ${ typeof value } )` ) ;
148+ }
149+ if ( value . length !== signature . child . length ) {
150+ throw new Error ( `expecting struct to have ${ signature . child . length } members (got ${ value . length } members)` ) ;
151+ }
132152 let result = [ ] ;
133153 for ( let i = 0 ; i < value . length ; ++ i ) {
134154 let v = value [ i ] ;
135- if ( v . constructor === Variant ) {
155+ if ( signature . child [ i ] === 'v' ) {
156+ if ( v . constructor !== Variant ) {
157+ throw new Error ( `expected a Variant for struct member ${ i + 1 } (got ${ v } )` ) ;
158+ }
136159 result . push ( jsToMarshalFmt ( v . signature , v . value ) ) ;
137160 } else {
138161 result . push ( jsToMarshalFmt ( signature . child [ i ] , v ) [ 1 ] ) ; ;
139162 }
140163 }
141- return [ signatureStr , result ] ;
164+ return [ signatureStr , result ] ;
165+ } else {
166+ throw new Error ( `got unknown complex type: ${ signature . type } ` ) ;
142167 }
143168}
144169
0 commit comments