Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -942,6 +942,11 @@ private void AddUriSegments(
}
else
{
var nullCheckExpression = valueExpression;
Comment thread
jorgerangel-msft marked this conversation as resolved.
Outdated
if (type is { IsNullable: true, IsValueType: true, IsEnum: false })
{
valueExpression = valueExpression.NullConditional();
}
valueExpression = type?.Equals(typeof(string)) == true
? valueExpression
: valueExpression.Invoke(nameof(ToString), toStringParams);
Expand All @@ -954,7 +959,7 @@ private void AddUriSegments(
: [uri.AppendPath(valueExpression, escape).Terminate()];
statement = BuildQueryOrHeaderOrPathParameterNullCheck(
type,
valueExpression,
nullCheckExpression,
appendPathStatements);
}
else
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1164,6 +1164,58 @@ public void TestBuildCreateRequestMethodWithPathParameters()
Assert.AreEqual(Helpers.GetExpectedFromFile(), file.Content);
}

[TestCase(true)]
[TestCase(false)]
public void NullableDatePathParameterIsGuardedBeforeFormatting(bool isRequired)
{
var dateType = new InputDateTimeType(
DateTimeKnownEncoding.Rfc7231,
"utcDateTime",
"TypeSpec.utcDateTime",
InputPrimitiveType.String);
var operation = InputFactory.Operation(
"GetThing",
parameters: [InputFactory.PathParameter("requestOn", dateType, isRequired: isRequired)],
path: "/things/{requestOn}");
var serviceMethod = InputFactory.BasicServiceMethod(
"GetThing",
operation,
parameters:
[
InputFactory.MethodParameter(
"requestOn",
dateType,
isRequired: isRequired,
location: InputRequestLocation.Path)
]);
var client = InputFactory.Client("TestClient", methods: [serviceMethod]);
var restClient = new ClientProvider(client).RestClient;

var file = new TypeProviderWriter(restClient).Write();
Assert.AreEqual(Helpers.GetExpectedFromFile(parameters: isRequired.ToString()), file.Content);
}

[Test]
public void OptionalEnumPathParameterIsNotUnwrapped()
Comment thread
jorgerangel-msft marked this conversation as resolved.
Outdated
Comment thread
jorgerangel-msft marked this conversation as resolved.
Outdated
{
var enumType = InputFactory.StringEnum(
"Color",
[("Red", "red"), ("Blue", "blue")],
isExtensible: true);
var operation = InputFactory.Operation(
"GetThing",
parameters: [InputFactory.PathParameter("color", enumType, isRequired: false, scope: InputParameterScope.Client)],
path: "/things/{color}");
var serviceMethod = InputFactory.BasicServiceMethod(
"GetThing",
operation);
var client = InputFactory.Client("TestClient", methods: [serviceMethod]);
var restClient = new ClientProvider(client).RestClient;

var file = new TypeProviderWriter(restClient).Write();
Assert.AreEqual(Helpers.GetExpectedFromFile(), file.Content);
}

// An optional trailing path parameter must not emit a dangling separator when null.
// e.g. "/certificates/{certificateName}/{certificateVersion}" with a null version
// should produce "/certificates/{name}", not "/certificates/{name}/".
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// <auto-generated/>

#nullable disable

using System;
using System.ClientModel.Primitives;

namespace Sample
{
public partial class TestClient
{
private static global::System.ClientModel.Primitives.PipelineMessageClassifier _pipelineMessageClassifier200;

private static global::System.ClientModel.Primitives.PipelineMessageClassifier PipelineMessageClassifier200 => _pipelineMessageClassifier200 ??= global::System.ClientModel.Primitives.PipelineMessageClassifier.Create(stackalloc ushort[] { 200 });

internal global::System.ClientModel.Primitives.PipelineMessage CreateGetThingRequest(global::System.DateTimeOffset? requestOn, global::System.ClientModel.Primitives.RequestOptions options)
{
global::Sample.ClientUriBuilder uri = new global::Sample.ClientUriBuilder();
uri.Reset(_endpoint);
uri.AppendPath("/things", false);
if ((requestOn != null))
{
uri.AppendPath("/", false);
uri.AppendPath(requestOn?.ToString("R"), true);
Comment thread
jorgerangel-msft marked this conversation as resolved.
Outdated
}
global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200);
global::System.ClientModel.Primitives.PipelineRequest request = message.Request;
message.Apply(options);
return message;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// <auto-generated/>

#nullable disable

using System;
using System.ClientModel.Primitives;

namespace Sample
{
public partial class TestClient
{
private static global::System.ClientModel.Primitives.PipelineMessageClassifier _pipelineMessageClassifier200;

private static global::System.ClientModel.Primitives.PipelineMessageClassifier PipelineMessageClassifier200 => _pipelineMessageClassifier200 ??= global::System.ClientModel.Primitives.PipelineMessageClassifier.Create(stackalloc ushort[] { 200 });

internal global::System.ClientModel.Primitives.PipelineMessage CreateGetThingRequest(global::System.DateTimeOffset requestOn, global::System.ClientModel.Primitives.RequestOptions options)
{
global::Sample.ClientUriBuilder uri = new global::Sample.ClientUriBuilder();
uri.Reset(_endpoint);
uri.AppendPath("/things/", false);
uri.AppendPath(requestOn.ToString("R"), true);
global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200);
global::System.ClientModel.Primitives.PipelineRequest request = message.Request;
message.Apply(options);
return message;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// <auto-generated/>

#nullable disable

using System.ClientModel.Primitives;

namespace Sample
{
public partial class TestClient
{
private static global::System.ClientModel.Primitives.PipelineMessageClassifier _pipelineMessageClassifier200;

private static global::System.ClientModel.Primitives.PipelineMessageClassifier PipelineMessageClassifier200 => _pipelineMessageClassifier200 ??= global::System.ClientModel.Primitives.PipelineMessageClassifier.Create(stackalloc ushort[] { 200 });

internal global::System.ClientModel.Primitives.PipelineMessage CreateGetThingRequest(global::System.ClientModel.Primitives.RequestOptions options)
{
global::Sample.ClientUriBuilder uri = new global::Sample.ClientUriBuilder();
uri.Reset(_endpoint);
uri.AppendPath("/things", false);
uri.AppendPath(_color?.ToString().ToString(), true);
Comment thread
jorgerangel-msft marked this conversation as resolved.
Outdated
global::System.ClientModel.Primitives.PipelineMessage message = Pipeline.CreateMessage(uri.ToUri(), "GET", PipelineMessageClassifier200);
global::System.ClientModel.Primitives.PipelineRequest request = message.Request;
message.Apply(options);
return message;
}
}
}
Loading