Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added ResponseHandler property and default implementation function #10

Merged
merged 11 commits into from
Dec 31, 2020
1 change: 1 addition & 0 deletions src/kiota.core/CodeDOM/CodeMethod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public class CodeMethod : CodeTerminal, ICloneable
{
public CodeType ReturnType;
public List<CodeParameter> Parameters = new List<CodeParameter>();
public bool IsStatic = false;

public object Clone()
{
Expand Down
1 change: 1 addition & 0 deletions src/kiota.core/CodeDOM/CodeProperty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ public override string Name
}
public bool ReadOnly = false;
public CodeType Type;
public string DefaultValue;
}
}
22 changes: 20 additions & 2 deletions src/kiota.core/KiotaBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,10 @@ private void CreateClass(CodeNamespace codeNamespace, OpenApiUrlSpaceNode node)
logger.LogDebug("Creating method {name} of {type}", method.Name, method.ReturnType);
codeClass.AddMethod(method);
}

CreateResponseHandler(codeClass);
}


codeNamespace.AddClass(codeClass);

Expand All @@ -246,12 +249,13 @@ private CodeIndexer CreateIndexer(string childIdentifier, string childType)
return prop;
}

private CodeProperty CreateProperty(string childIdentifier, string childType)
private CodeProperty CreateProperty(string childIdentifier, string childType, string defaultValue = null)
{
var prop = new CodeProperty()
{
Name = childIdentifier,
Type = new CodeType() { Name = childType }
Type = new CodeType() { Name = childType },
DefaultValue = defaultValue
};
logger.LogDebug("Creating property {name} of {type}", prop.Name, prop.Type.Name);
return prop;
Expand Down Expand Up @@ -380,5 +384,19 @@ private static string FixPathIdentifier(string identifier)
}
return identifier.ToCamelCase();
}

private void CreateResponseHandler(CodeClass requestBuilder)
{
// Default ResponseHandler Implementation
var responseHandlerImpl = new CodeMethod() { Name = "DefaultResponseHandler", IsStatic = true };
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
responseHandlerImpl.AddParameter(new CodeParameter() { Name = "response", Type = new CodeType() { Name = "object" } }); // replace native HTTP response object type in language refiner
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
responseHandlerImpl.ReturnType = new CodeType() { Name = "object" };
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
requestBuilder.AddMethod(responseHandlerImpl);

// Property to allow replacing Response Handler
var responseHandlerProperty = CreateProperty("ResponseHandler", "Func<object,object>", "DefaultResponseHandler"); // HttpResponseMessage, model
responseHandlerProperty.ReadOnly = false;
requestBuilder.AddProperty(responseHandlerProperty);
}
}
}
33 changes: 32 additions & 1 deletion src/kiota.core/Refiners/CSharpRefiner.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,45 @@
using System.Linq;
using System.Linq;
using System.Text.RegularExpressions;

namespace kiota.core {
public class CSharpRefiner : CommonLanguageRefiner, ILanguageRefiner
{
private Regex responseHandlerType = new Regex("<(.*),object>");
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
public override void Refine(CodeNamespace generatedCode)
{
generatedCode.AddUsing(new CodeUsing() { Name = "System" });
generatedCode.AddUsing(new CodeUsing() { Name = "System.Threading.Tasks" });
generatedCode.AddUsing(new CodeUsing() { Name = "System.Net.Http" });
AddAsyncSuffix(generatedCode);
AddInnerClasses(generatedCode);
MakeNativeResponseHandlers(generatedCode);
}

private void MakeNativeResponseHandlers(CodeNamespace generatedCode)
{
foreach (var codeElement in generatedCode.InnerChildElements)
{
switch (codeElement)
{
case CodeClass c:
var responseHandlerProp = c.InnerChildElements.Where(e => e is CodeProperty && e.Name == "ResponseHandler")
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
.Cast<CodeProperty>().FirstOrDefault();
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
if (responseHandlerProp != null)
{
responseHandlerProp.Type.Name = responseHandlerType.Replace(responseHandlerProp.Type.Name, "<HttpResponseMessage,Task<$1>>"); // TODO: We should probably generic types properly
}
var defaultResponseHandler = c.InnerChildElements.Where(e => e is CodeMethod && e.Name == "DefaultResponseHandler")
.Cast<CodeMethod>().FirstOrDefault();
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
if (defaultResponseHandler != null)
{
defaultResponseHandler.Parameters.FirstOrDefault().Type.Name = "HttpResponseMessage";
}
break;
case CodeNamespace n:
MakeNativeResponseHandlers(n);
break;
}
}
}
private void AddAsyncSuffix(CodeElement currentElement) {
if(currentElement is CodeMethod currentMethod)
Expand Down
18 changes: 15 additions & 3 deletions src/kiota.core/Writers/CSharpWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,17 @@ public override void WriteCodeClassEnd(CodeClass.End code)

public override void WriteProperty(CodeProperty code)
{

WriteLine($"public {GetTypeString(code.Type)} {code.Name} {{get;}}");
var simpleBody = "get;";
if (!code.ReadOnly)
{
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
simpleBody = "get;set;";
}
var defaultValue = "";
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
if (code.DefaultValue != null)
{
defaultValue = " = " + code.DefaultValue + ";";
}
WriteLine($"public {GetTypeString(code.Type)} {code.Name} {{{simpleBody}}} {defaultValue}");
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
}

public override void WriteIndexer(CodeIndexer code)
Expand All @@ -47,7 +56,10 @@ public override void WriteIndexer(CodeIndexer code)

public override void WriteMethod(CodeMethod code)
{
WriteLine($"public Task<{GetTypeString(code.ReturnType)}> {code.Name}({string.Join(',', code.Parameters.Select(p=> GetParameterSignature(p)).ToList())}) {{ return null; }}");
var staticModifier = code.IsStatic ? "static " : "";
darrelmiller marked this conversation as resolved.
Show resolved Hide resolved
// Task type should be moved into the refiner
WriteLine($"public {staticModifier}Task<{GetTypeString(code.ReturnType)}> {code.Name}({string.Join(',', code.Parameters.Select(p=> GetParameterSignature(p)).ToList())}) {{ return null; }}");

}

public override void WriteType(CodeType code)
Expand Down