void RenderGetOrDeleteImplementation(CodeExpression httpMethodInvokeExpression)
        {
            //Create function parameters
            var parameters = description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression()
            {
                Name = d.Name,
                Type = poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType),
            }).ToArray();

            method.Parameters.AddRange(parameters);

            var jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions);
            var uriText    = jsUriQuery == null ? $"new Uri(this.baseUri, \"{description.RelativePath}\")" :
                             RemoveTrialEmptyString($"new Uri(this.baseUri, \"{jsUriQuery}\")");

            method.Statements.Add(new CodeVariableDeclarationStatement(
                                      new CodeTypeReference("var"), "requestUri",
                                      new CodeSnippetExpression(uriText)));

            //Statement: var result = this.client.GetAsync(requestUri.ToString()).Result;
            method.Statements.Add(new CodeVariableDeclarationStatement(
                                      new CodeTypeReference("var"), "responseMessage", httpMethodInvokeExpression));

            ////Statement: var result = task.Result;
            var resultReference = new CodeVariableReferenceExpression("responseMessage");

            //Statement: result.EnsureSuccessStatusCode();
            method.Statements.Add(new CodeMethodInvokeExpression(resultReference, "EnsureSuccessStatusCode"));

            //Statement: return something;
            if (returnType != null)
            {
                AddReturnStatement();
            }
        }
Exemple #2
0
        void RenderPostOrPutImplementation(bool isPost)
        {
            //Create function parameters in prototype
            var parameters = description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression()
            {
                Name = d.Name,
                Type = poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType),
            }).ToArray();

            method.Parameters.AddRange(parameters);

            var fromBodyParameterDescriptions = description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                        (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) || (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();

            if (fromBodyParameterDescriptions.Length > 1)
            {
                throw new CodeGenException("Bad Api Definition")
                      {
                          Description = String.Format("This API function {0} has more than 1 FromBody bindings in parameters", description.ActionDescriptor.ActionName)
                      };
            }

            var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

            void AddRequestUriWithQueryAssignmentStatement()
            {
                var    jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions);
                string uriText;

                if (diFriendly)
                {
                    uriText = jsUriQuery == null ? $"\"{description.RelativePath}\"" : RemoveTrialEmptyString($"\"{jsUriQuery}\"");
                }
                else
                {
                    uriText = jsUriQuery == null ? $"new Uri(this.baseUri, \"{description.RelativePath}\")" :
                              RemoveTrialEmptyString($"new Uri(this.baseUri, \"{jsUriQuery}\")");
                }

                method.Statements.Add(new CodeVariableDeclarationStatement(
                                          new CodeTypeReference("var"), "requestUri",
                                          new CodeSnippetExpression(uriText)));
            }

            void AddPostStatement(CodeExpression httpMethodInvokeExpression)
            {
                //Statement: var task = this.client.GetAsync(requestUri.ToString());
                method.Statements.Add(new CodeVariableDeclarationStatement(
                                          new CodeTypeReference("var"), "responseMessage", httpMethodInvokeExpression));
            }

            AddRequestUriWithQueryAssignmentStatement();

            if (singleFromBodyParameterDescription != null)
            {
                method.Statements.Add(new CodeSnippetStatement(
                                          @"			using (var requestWriter = new System.IO.StringWriter())
			{
			var requestSerializer = JsonSerializer.Create();"
                                          ));
                method.Statements.Add(new CodeMethodInvokeExpression(new CodeSnippetExpression("requestSerializer"), "Serialize",
                                                                     new CodeSnippetExpression("requestWriter"),
                                                                     new CodeSnippetExpression(singleFromBodyParameterDescription.ParameterDescriptor.ParameterName)));


                method.Statements.Add(new CodeSnippetStatement(
                                          @"			var content = new StringContent(requestWriter.ToString(), System.Text.Encoding.UTF8, ""application/json"");"
                                          ));

                if (forAsync)
                {
                    AddPostStatement(
                        new CodeMethodInvokeExpression(new CodeSnippetExpression("await " + sharedContext.ClientReference.FieldName), isPost ?
                                                       "PostAsync" : "PutAsync", new CodeSnippetExpression("requestUri")
                                                       , new CodeSnippetExpression("content")));
                }
                else
                {
                    AddPostStatement(new CodePropertyReferenceExpression(
                                         new CodeMethodInvokeExpression(sharedContext.ClientReference, isPost ?
                                                                        "PostAsync" : "PutAsync", new CodeSnippetExpression("requestUri")
                                                                        , new CodeSnippetExpression("content"))
                                         , "Result"));
                }
            }
            else
            {
                if (forAsync)
                {
                    AddPostStatement(
                        new CodeMethodInvokeExpression(new CodeSnippetExpression("await " + sharedContext.ClientReference.FieldName), isPost ? "PostAsync" : "PutAsync"
                                                       , new CodeSnippetExpression("requestUri")
                                                       , new CodeSnippetExpression("new StringContent(String.Empty)")));
                }
                else
                {
                    AddPostStatement(new CodePropertyReferenceExpression(
                                         new CodeMethodInvokeExpression(sharedContext.ClientReference, isPost ? "PostAsync" : "PutAsync"
                                                                        , new CodeSnippetExpression("requestUri")
                                                                        , new CodeSnippetExpression("new StringContent(String.Empty)"))
                                         , "Result"));
                }
            }

            var resultReference = new CodeVariableReferenceExpression("responseMessage");

            if (returnTypeIsStream)
            {
                method.Statements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode));

                //Statement: return something;
                if (returnType != null)
                {
                    AddReturnStatement(method.Statements);
                }
            }
            else
            {
                CodeTryCatchFinallyStatement try1 = new CodeTryCatchFinallyStatement();
                method.Statements.Add(try1);
                try1.TryStatements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode));

                //Statement: return something;
                if (returnType != null)
                {
                    AddReturnStatement(try1.TryStatements);
                }

                try1.FinallyStatements.Add(new CodeMethodInvokeExpression(resultReference, "Dispose"));
            }

            if (singleFromBodyParameterDescription != null)
            {
                method.Statements.Add(new CodeSnippetStatement("\t\t\t}"));
            }
        }
Exemple #3
0
        void RenderGetOrDeleteImplementation(CodeExpression httpMethodInvokeExpression)
        {
            //Create function parameters
            var parameters = description.ParameterDescriptions.Select(d => new CodeParameterDeclarationExpression()
            {
                Name = d.Name,
                Type = poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType),
            }).ToArray();

            method.Parameters.AddRange(parameters);

            var    jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions);
            string uriText;

            if (diFriendly)
            {
                uriText = jsUriQuery == null ? $"\"{description.RelativePath}\"" : RemoveTrialEmptyString($"\"{jsUriQuery}\"");
            }
            else
            {
                uriText = jsUriQuery == null ? $"new Uri(this.baseUri, \"{description.RelativePath}\")" :
                          RemoveTrialEmptyString($"new Uri(this.baseUri, \"{jsUriQuery}\")");
            }

            method.Statements.Add(new CodeVariableDeclarationStatement(
                                      new CodeTypeReference("var"), "requestUri",
                                      new CodeSnippetExpression(uriText)));

            //Statement: var result = this.client.GetAsync(requestUri.ToString()).Result;
            method.Statements.Add(new CodeVariableDeclarationStatement(
                                      new CodeTypeReference("var"), "responseMessage", httpMethodInvokeExpression));


            ////Statement: var result = task.Result;
            var resultReference = new CodeVariableReferenceExpression("responseMessage");

            //Statement: result.EnsureSuccessStatusCode();
            if (returnTypeIsStream)
            {
                method.Statements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode));

                if (returnType != null)
                {
                    //Debug.Assert(!returnType.FullName.Contains("JObject"));
                    AddReturnStatement(method.Statements);
                }
            }
            else
            {
                CodeTryCatchFinallyStatement try1 = new CodeTryCatchFinallyStatement();
                try1.TryStatements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode));
                method.Statements.Add(try1);

                //Statement: return something;
                if (returnType != null)
                {
                    //Debug.Assert(!returnType.FullName.Contains("JObject"));
                    AddReturnStatement(try1.TryStatements);
                }

                try1.FinallyStatements.Add(new CodeMethodInvokeExpression(resultReference, "Dispose"));
            }
        }
        void RenderPostOrPutImplementation(string httpMethod, bool forAsync)
        {
            //Create function parameters in prototype
            var parameters = description.ParameterDescriptions.Where(p => p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri ||
                                                                     p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromQuery || p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                     p.ParameterDescriptor.ParameterBinder == ParameterBinder.None).Select(d => new CodeParameterDeclarationExpression()
            {
                Name = d.Name,
                Type = poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType),
            }).ToArray();

            method.Parameters.AddRange(parameters);

            if (settings.HandleHttpRequestHeaders)
            {
                method.Parameters.Add(new CodeParameterDeclarationExpression(
                                          "Action<System.Net.Http.Headers.HttpRequestHeaders>", "handleHeaders = null"));
            }

            var fromBodyParameterDescriptions = description.ParameterDescriptions.Where(d => d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromBody ||
                                                                                        (TypeHelper.IsComplexType(d.ParameterDescriptor.ParameterType) && (!(d.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri) || (d.ParameterDescriptor.ParameterBinder == ParameterBinder.None)))).ToArray();

            if (fromBodyParameterDescriptions.Length > 1)
            {
                throw new CodeGenException("Bad Api Definition")
                      {
                          Description = String.Format("This API function {0} has more than 1 FromBody bindings in parameters", description.ActionDescriptor.ActionName)
                      };
            }

            var singleFromBodyParameterDescription = fromBodyParameterDescriptions.FirstOrDefault();

            void AddRequestUriWithQueryAssignmentStatement()
            {
                var    jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions);
                string uriText    = jsUriQuery == null ? $"\"{description.RelativePath}\"" : RemoveTrialEmptyString($"\"{jsUriQuery}\"");

                method.Statements.Add(new CodeVariableDeclarationStatement(
                                          new CodeTypeReference("var"), "requestUri",
                                          new CodeSnippetExpression(uriText)));
            }

            AddRequestUriWithQueryAssignmentStatement();

            method.Statements.Add(new CodeSnippetStatement(
                                      $@"			using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.{httpMethod}, requestUri))
			{{"
                                      ));

            if (singleFromBodyParameterDescription != null)
            {
                method.Statements.Add(new CodeSnippetStatement(
                                          @"			using (var requestWriter = new System.IO.StringWriter())
			{
			var requestSerializer = JsonSerializer.Create(jsonSerializerSettings);"
                                          ));
                method.Statements.Add(new CodeMethodInvokeExpression(new CodeSnippetExpression("requestSerializer"), "Serialize",
                                                                     new CodeSnippetExpression("requestWriter"),
                                                                     new CodeSnippetExpression(singleFromBodyParameterDescription.ParameterDescriptor.ParameterName)));


                method.Statements.Add(new CodeSnippetStatement(
                                          @"			var content = new StringContent(requestWriter.ToString(), System.Text.Encoding.UTF8, ""application/json"");"
                                          ));

                method.Statements.Add(new CodeSnippetStatement(@"			httpRequestMessage.Content = content;"));
                if (settings.HandleHttpRequestHeaders)
                {
                    method.Statements.Add(new CodeSnippetStatement(@"			if (handleHeaders != null)
			{
				handleHeaders(httpRequestMessage.Headers);
			}
"));
                }

                method.Statements.Add(new CodeVariableDeclarationStatement(
                                          new CodeTypeReference("var"), "responseMessage", forAsync ? new CodeSnippetExpression("await client.SendAsync(httpRequestMessage)") : new CodeSnippetExpression("client.SendAsync(httpRequestMessage).Result")));
            }
            else
            {
                method.Statements.Add(new CodeVariableDeclarationStatement(
                                          new CodeTypeReference("var"), "responseMessage", forAsync ? new CodeSnippetExpression("await client.SendAsync(httpRequestMessage)") : new CodeSnippetExpression("client.SendAsync(httpRequestMessage).Result")));
            }

            var resultReference = new CodeVariableReferenceExpression("responseMessage");

            if (returnTypeIsStream)
            {
                method.Statements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode));

                //Statement: return something;
                if (returnType != null)
                {
                    AddReturnStatement(method.Statements);
                }
            }
            else
            {
                CodeTryCatchFinallyStatement try1 = new CodeTryCatchFinallyStatement();
                method.Statements.Add(try1);
                try1.TryStatements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode));

                //Statement: return something;
                if (returnType != null)
                {
                    AddReturnStatement(try1.TryStatements);
                }

                try1.FinallyStatements.Add(new CodeMethodInvokeExpression(resultReference, "Dispose"));
            }

            if (singleFromBodyParameterDescription != null)
            {
                method.Statements.Add(new CodeSnippetStatement("\t\t\t}"));
            }

            method.Statements.Add(new CodeSnippetStatement("\t\t\t}"));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="httpMethod">GET, DELETE, POST, PUT</param>
        /// <param name="forAsync"></param>
        void RenderGetOrDeleteImplementation(string httpMethod, bool forAsync)
        {
            CodeParameterDeclarationExpression[] parameters = description.ParameterDescriptions.Where(p => p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromUri ||
                                                                                                      p.ParameterDescriptor.ParameterBinder == ParameterBinder.FromQuery || p.ParameterDescriptor.ParameterBinder == ParameterBinder.None)
                                                              .Select(d =>
                                                                      new CodeParameterDeclarationExpression(poco2CsGen.TranslateToClientTypeReference(d.ParameterDescriptor.ParameterType), d.Name))
                                                              .ToArray();
            method.Parameters.AddRange(parameters);

            if (settings.HandleHttpRequestHeaders)
            {
                method.Parameters.Add(new CodeParameterDeclarationExpression(
                                          "Action<System.Net.Http.Headers.HttpRequestHeaders>", "handleHeaders = null"));
            }

            var    jsUriQuery = UriQueryHelper.CreateUriQuery(description.RelativePath, description.ParameterDescriptions);
            string uriText    = jsUriQuery == null ? $"\"{description.RelativePath}\"" : RemoveTrialEmptyString($"\"{jsUriQuery}\"");


            method.Statements.Add(new CodeVariableDeclarationStatement(
                                      new CodeTypeReference("var"), "requestUri",
                                      new CodeSnippetExpression(uriText)));

            method.Statements.Add(new CodeSnippetStatement(
                                      $@"			using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.{httpMethod}, requestUri))
			{{"
                                      ));

            if (settings.HandleHttpRequestHeaders)
            {
                method.Statements.Add(new CodeSnippetStatement(
                                          $@"			if (handleHeaders != null)
			{{
				handleHeaders(httpRequestMessage.Headers);
			}}
"
                                          ));
            }

            method.Statements.Add(new CodeVariableDeclarationStatement(
                                      new CodeTypeReference("var"), "responseMessage", forAsync ? new CodeSnippetExpression("await client.SendAsync(httpRequestMessage)") : new CodeSnippetExpression("client.SendAsync(httpRequestMessage).Result")));


            CodeVariableReferenceExpression resultReference = new CodeVariableReferenceExpression("responseMessage");

            //Statement: result.EnsureSuccessStatusCode();
            if (returnTypeIsStream)
            {
                method.Statements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode));

                if (returnType != null)
                {
                    //Debug.Assert(!returnType.FullName.Contains("JObject"));
                    AddReturnStatement(method.Statements);
                }

                method.Statements.Add(new CodeSnippetStatement("\t\t\t}"));
            }
            else
            {
                CodeTryCatchFinallyStatement try1 = new CodeTryCatchFinallyStatement();
                try1.TryStatements.Add(new CodeMethodInvokeExpression(resultReference, statementOfEnsureSuccessStatusCode));
                method.Statements.Add(try1);

                //Statement: return something;
                if (returnType != null)
                {
                    //Debug.Assert(!returnType.FullName.Contains("JObject"));
                    AddReturnStatement(try1.TryStatements);
                }

                try1.FinallyStatements.Add(new CodeMethodInvokeExpression(resultReference, "Dispose"));
                method.Statements.Add(new CodeSnippetStatement("\t\t\t}"));
            }
        }