@@ -15,10 +15,8 @@ namespace AutoRest.CSharp.Generation.Writers
1515{
1616 internal static class ResponseWriterHelpers
1717 {
18- public static void WriteStatusCodeSwitch ( CodeWriter writer , string messageVariableName , RestClientMethod operation , bool async , FieldDeclaration ? clientDiagnosticsField )
18+ public static void WriteRawResponseToGeneric ( CodeWriter writer , RestClientMethod operation , Output . Models . Responses . Response response , bool async , string ? messageVariableName , FormattableString responseVariable )
1919 {
20- FormattableString responseVariable = $ "{ messageVariableName } .Response";
21-
2220 var returnType = operation . ReturnType ;
2321 var headersModelType = operation . HeaderModel ? . Type ;
2422
@@ -41,6 +39,92 @@ public static void WriteStatusCodeSwitch(CodeWriter writer, string messageVariab
4139 kind = ReturnKind . Response ;
4240 }
4341
42+ var responseBody = response . ResponseBody ;
43+ ReferenceOrConstant value = default ;
44+
45+ var valueVariable = new CodeWriterDeclaration ( "value" ) ;
46+ switch ( responseBody )
47+ {
48+ case ObjectResponseBody objectResponseBody :
49+ writer . Line ( $ "{ responseBody . Type } { valueVariable : D} = default;") ;
50+ writer . WriteDeserializationForMethods ( objectResponseBody . Serialization , async, valueVariable , responseVariable , objectResponseBody . Type ) ;
51+ value = new Reference ( valueVariable . ActualName , responseBody . Type ) ;
52+ break ;
53+ case StreamResponseBody _:
54+ writer . Line ( $ "var { valueVariable : D} = { messageVariableName } .ExtractResponseContent();") ;
55+ value = new Reference ( valueVariable . ActualName , responseBody . Type ) ;
56+ break ;
57+ case ConstantResponseBody body :
58+ writer . Append ( $ "{ returnType } { valueVariable : D} = ") ;
59+ writer . WriteReferenceOrConstant ( body . Value ) ;
60+ writer . Line ( $ ";") ;
61+ value = new Reference ( valueVariable . ActualName , responseBody . Type ) ;
62+ break ;
63+ case StringResponseBody _:
64+ var streamReaderVariable = new CodeWriterDeclaration ( "streamReader" ) ;
65+ writer . Line ( $ "{ typeof ( StreamReader ) } { streamReaderVariable : D} = new { typeof ( StreamReader ) } ({ responseVariable } .ContentStream);") ;
66+ writer . Append ( $ "{ returnType } { valueVariable : D} = ") ;
67+ if ( async)
68+ {
69+ writer . Line ( $ "await { streamReaderVariable } .ReadToEndAsync().ConfigureAwait(false);") ;
70+ }
71+ else
72+ {
73+ writer . Line ( $ "{ streamReaderVariable } .ReadToEnd();") ;
74+ }
75+ value = new Reference ( valueVariable . ActualName , responseBody . Type ) ;
76+ break ;
77+ default :
78+ {
79+ if ( returnType != null )
80+ {
81+ value = Constant . Default ( returnType . WithNullable ( true ) ) ;
82+ }
83+
84+ break;
85+ }
86+ }
87+
88+ switch ( kind )
89+ {
90+ case ReturnKind. Response :
91+ writer. Append ( $ "return { responseVariable } ;") ;
92+ break ;
93+ case ReturnKind. Headers :
94+ writer. Append ( $ "return { typeof ( ResponseWithHeaders ) } .FromValue(headers, { responseVariable } );") ;
95+ break ;
96+ case ReturnKind. HeadersAndValue :
97+ writer. Append ( $ "return { typeof ( ResponseWithHeaders ) } .FromValue") ;
98+ if ( ! Equals ( responseBody ? . Type , operation . ReturnType ) )
99+ {
100+ writer. Append ( $ "<{ operation . ReturnType } , { headersModelType } >") ;
101+ }
102+ writer. Append ( $ "(") ;
103+ writer. WriteReferenceOrConstant ( value ) ;
104+ writer. Append ( $ ", headers, { responseVariable } );") ;
105+ break ;
106+ case ReturnKind. Value :
107+ writer. Append ( $ "return { typeof ( Azure . Response ) } .FromValue") ;
108+ if ( ! Equals ( responseBody ? . Type , operation . ReturnType ) )
109+ {
110+ writer. Append ( $ "<{ operation . ReturnType } >") ;
111+ }
112+ writer. Append ( $ "(") ;
113+ writer. WriteReferenceOrConstant ( value ) ;
114+ writer. Append ( $ ", { responseVariable } );") ;
115+ break ;
116+ default :
117+ throw new ArgumentOutOfRangeException( ) ;
118+ }
119+ }
120+
121+ public static void WriteStatusCodeSwitch( CodeWriter writer , string messageVariableName , RestClientMethod operation , bool async , FieldDeclaration ? clientDiagnosticsField )
122+ {
123+ FormattableString responseVariable = $"{ messageVariableName} . Response";
124+
125+ var returnType = operation . ReturnType ;
126+ var headersModelType = operation . HeaderModel ? . Type ;
127+
44128 if ( headersModelType != null )
45129 {
46130 writer. Line ( $ "var headers = new { headersModelType } ({ responseVariable } );") ;
@@ -67,82 +151,7 @@ public static void WriteStatusCodeSwitch(CodeWriter writer, string messageVariab
67151
68152 using ( responseBody != null ? writer . Scope ( ) : default )
69153 {
70- ReferenceOrConstant value = default ;
71-
72- var valueVariable = new CodeWriterDeclaration ( "value" ) ;
73- switch ( responseBody )
74- {
75- case ObjectResponseBody objectResponseBody :
76- writer . Line ( $ "{ responseBody . Type } { valueVariable : D} = default;") ;
77- writer . WriteDeserializationForMethods ( objectResponseBody . Serialization , async, valueVariable , responseVariable , objectResponseBody . Type ) ;
78- value = new Reference ( valueVariable . ActualName , responseBody . Type ) ;
79- break ;
80- case StreamResponseBody _:
81- writer . Line ( $ "var { valueVariable : D} = { messageVariableName } .ExtractResponseContent();") ;
82- value = new Reference ( valueVariable . ActualName , responseBody . Type ) ;
83- break ;
84- case ConstantResponseBody body :
85- writer . Append ( $ "{ returnType } { valueVariable : D} = ") ;
86- writer . WriteReferenceOrConstant ( body . Value ) ;
87- writer . Line ( $ ";") ;
88- value = new Reference ( valueVariable . ActualName , responseBody . Type ) ;
89- break ;
90- case StringResponseBody _:
91- var streamReaderVariable = new CodeWriterDeclaration ( "streamReader" ) ;
92- writer . Line ( $ "{ typeof ( StreamReader ) } { streamReaderVariable : D} = new { typeof ( StreamReader ) } ({ messageVariableName } .Response.ContentStream);") ;
93- writer . Append ( $ "{ returnType } { valueVariable : D} = ") ;
94- if ( async)
95- {
96- writer . Line ( $ "await { streamReaderVariable } .ReadToEndAsync().ConfigureAwait(false);") ;
97- }
98- else
99- {
100- writer . Line ( $ "{ streamReaderVariable } .ReadToEnd();") ;
101- }
102- value = new Reference ( valueVariable . ActualName , responseBody . Type ) ;
103- break ;
104- default :
105- {
106- if ( returnType != null )
107- {
108- value = Constant . Default ( returnType . WithNullable ( true ) ) ;
109- }
110-
111- break;
112- }
113- }
114-
115- switch ( kind )
116- {
117- case ReturnKind. Response :
118- writer. Append ( $ "return { responseVariable } ;") ;
119- break ;
120- case ReturnKind. Headers :
121- writer. Append ( $ "return { typeof ( ResponseWithHeaders ) } .FromValue(headers, { responseVariable } );") ;
122- break ;
123- case ReturnKind. HeadersAndValue :
124- writer. Append ( $ "return { typeof ( ResponseWithHeaders ) } .FromValue") ;
125- if ( ! Equals ( responseBody ? . Type , operation . ReturnType ) )
126- {
127- writer. Append ( $ "<{ operation . ReturnType } , { headersModelType } >") ;
128- }
129- writer. Append ( $ "(") ;
130- writer. WriteReferenceOrConstant ( value ) ;
131- writer. Append ( $ ", headers, { responseVariable } );") ;
132- break ;
133- case ReturnKind. Value :
134- writer. Append ( $ "return { typeof ( Azure . Response ) } .FromValue") ;
135- if ( ! Equals ( responseBody ? . Type , operation . ReturnType ) )
136- {
137- writer. Append ( $ "<{ operation . ReturnType } >") ;
138- }
139- writer. Append ( $ "(") ;
140- writer. WriteReferenceOrConstant ( value ) ;
141- writer. Append ( $ ", { responseVariable } );") ;
142- break ;
143- default :
144- throw new ArgumentOutOfRangeException( ) ;
145- }
154+ WriteRawResponseToGeneric ( writer , operation , response , async , messageVariableName , responseVariable ) ;
146155 }
147156 }
148157
0 commit comments