Skip to content

Commit a442131

Browse files
committed
Updates path info builder on attribute
1 parent e2869db commit a442131

File tree

4 files changed

+44
-15
lines changed

4 files changed

+44
-15
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ Grapevine is available on [NuGet.org](https://www.nuget.org/packages/Grapevine/)
1010

1111
Powershell:
1212
```powershell
13-
Install-Package Grapevine -Version 5.0.0-rc.2
13+
Install-Package Grapevine -Version 5.0.0-rc.3
1414
```
1515

1616
.NET CLI
1717
```cmd
18-
> dotnet add package Grapevine --version 5.0.0-rc.2
18+
> dotnet add package Grapevine --version 5.0.0-rc.3
1919
```
2020

2121
## Usage

src/Grapevine/InternalExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Grapevine
88
{
99
public static class InternalExtensions
1010
{
11-
private static readonly Regex ParseForParams = new Regex(@"\[(\w+)\]", RegexOptions.IgnoreCase);
11+
private static readonly Regex ParseForParams = new Regex(@"\{(\w+)\}", RegexOptions.IgnoreCase);
1212

1313
internal static string SanitizePath(this string path)
1414
{

src/Grapevine/RestRouteAttribute.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,19 @@ public static object[] GenerateRouteConstructorArguments(this RestRouteAttribute
7272

7373
args[1] = attribute.HttpMethod;
7474

75-
args[2] = (string.IsNullOrWhiteSpace(basePath))
76-
? attribute.PathInfo.SanitizePath()
77-
: $"{basePath.SanitizePath()}{attribute.PathInfo.SanitizePath()}";
75+
var basepath = basePath.SanitizePath();
76+
if (!string.IsNullOrWhiteSpace(attribute.PathInfo))
77+
{
78+
var appendStart = "";
79+
if (attribute.PathInfo.StartsWith("^"))
80+
{
81+
appendStart = "^";
82+
attribute.PathInfo = attribute.PathInfo.TrimStart('^');
83+
}
84+
basepath = $"{appendStart}{basepath}{attribute.PathInfo.SanitizePath()}";
85+
}
86+
87+
args[2] = basepath;
7888

7989
args[3] = attribute.Enabled;
8090
args[4] = (!string.IsNullOrWhiteSpace(attribute.Name))

src/Samples/Resources/TransientResource.cs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,53 @@ public TransientResource()
1717
Counter++;
1818
}
1919

20-
[RestRoute]
20+
[RestRoute("Get", "{key}/{value}")]
2121
public async Task TransientCallA(IHttpContext context)
2222
{
23-
// You can store anything in locals!
2423
if (!context.Contains("Call-Order")) context.Set("Call-Order", new StringBuilder());
2524
context.GetAs<StringBuilder>("Call-Order").Append($"A-{Counter}{Environment.NewLine}");
25+
26+
if (!context.Contains("PathParameters")) context.Set("PathParameters", new StringBuilder());
27+
var sb = context.GetAs<StringBuilder>("PathParameters");
28+
29+
sb.Append($"A: Count: {context.Request.PathParameters.Count}{Environment.NewLine}");
30+
sb.Append($"\tkey: {context.Request.PathParameters["key"]}{Environment.NewLine}");
31+
sb.Append($"\tvalue: {context.Request.PathParameters["value"]}{Environment.NewLine}");
32+
2633
await Task.CompletedTask;
2734
}
2835

29-
[RestRoute]
36+
[RestRoute("Get", @"^/([a-zA-Z]+)/(\d{1,})")]
3037
public async Task TransientCallB(IHttpContext context)
3138
{
32-
// You can store anything in locals!
3339
if (!context.Contains("Call-Order")) context.Set("Call-Order", new StringBuilder());
3440
context.GetAs<StringBuilder>("Call-Order").Append($"B-{Counter}{Environment.NewLine}");
41+
42+
if (!context.Contains("PathParameters")) context.Set("PathParameters", new StringBuilder());
43+
var sb = context.GetAs<StringBuilder>("PathParameters");
44+
45+
sb.Append($"B: Count: {context.Request.PathParameters.Count}{Environment.NewLine}");
46+
sb.Append($"\tp0: {context.Request.PathParameters["p0"]}{Environment.NewLine}");
47+
sb.Append($"\tp1: {context.Request.PathParameters["p1"]}{Environment.NewLine}");
48+
3549
await Task.CompletedTask;
3650
}
3751

38-
[RestRoute]
52+
[RestRoute("Get", "{thing1}/{thing2}")]
3953
public async Task TransientCallC(IHttpContext context)
4054
{
41-
// You can store anything in locals!
4255
if (!context.Contains("Call-Order")) context.Set("Call-Order", new StringBuilder());
56+
var co = context.GetAs<StringBuilder>("Call-Order");
57+
co.Append($"C-{Counter}{Environment.NewLine}");
58+
59+
if (!context.Contains("PathParameters")) context.Set("PathParameters", new StringBuilder());
60+
var sb = context.GetAs<StringBuilder>("PathParameters");
4361

44-
var sb = context.GetAs<StringBuilder>("Call-Order");
45-
sb.Append($"C-{Counter}{Environment.NewLine}");
62+
sb.Append($"C: Count: {context.Request.PathParameters.Count}{Environment.NewLine}");
63+
sb.Append($"\tthing1: {context.Request.PathParameters["thing1"]}{Environment.NewLine}");
64+
sb.Append($"\tthing2: {context.Request.PathParameters["thing2"]}{Environment.NewLine}");
4665

47-
await context.Response.SendResponseAsync(sb.ToString());
66+
await context.Response.SendResponseAsync($"{sb.ToString()}{Environment.NewLine}{co.ToString()}");
4867
}
4968
}
5069
}

0 commit comments

Comments
 (0)