Skip to content

Commit 85bb9f4

Browse files
committed
#258 Adds extension method for splitting with spans. Updates usages and unit tests to use extension method.
1 parent cfa785f commit 85bb9f4

File tree

8 files changed

+23
-7
lines changed

8 files changed

+23
-7
lines changed

src/JsonApiDotNetCore/Builders/LinkBuilder.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Text;
3+
using JsonApiDotNetCore.Extensions;
34
using JsonApiDotNetCore.Internal;
45
using JsonApiDotNetCore.Services;
56
using Microsoft.AspNetCore.Http;
@@ -27,7 +28,7 @@ private static string GetNamespaceFromPath(string path, string entityName)
2728
{
2829
var sb = new StringBuilder();
2930
var entityNameSpan = entityName.AsSpan();
30-
var subSpans = new SpanSplitter(ref path, '/');
31+
var subSpans = path.SpanSplit('/');
3132
for (var i = 1; i < subSpans.Count; i++)
3233
{
3334
var span = subSpans[i];

src/JsonApiDotNetCore/Extensions/StringExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Text;
4+
using JsonApiDotNetCore.Internal;
45

56
namespace JsonApiDotNetCore.Extensions
67
{
@@ -62,6 +63,11 @@ public static IEnumerable<int> IndexesOf(this string str, char delimeter)
6263
}
6364
return indexes;
6465
}
66+
67+
public static SpanSplitter SpanSplit(this string str, char delimeter)
68+
{
69+
return SpanSplitter.Split(str, delimeter);
70+
}
6571

6672
}
6773
}

src/JsonApiDotNetCore/Internal/Query/RelatedAttrFilterQuery.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Linq;
3+
using JsonApiDotNetCore.Extensions;
34
using JsonApiDotNetCore.Models;
45
using JsonApiDotNetCore.Services;
56

@@ -15,7 +16,7 @@ public RelatedAttrFilterQuery(
1516
{
1617
_jsonApiContext = jsonApiCopntext;
1718
var filterQueryAttribute = filterQuery.Attribute;
18-
var filterQuerySubSpans = new SpanSplitter(ref filterQueryAttribute, '.');
19+
var filterQuerySubSpans = filterQueryAttribute.SpanSplit('.');
1920
var subSpan1 = filterQuerySubSpans[0].ToString();
2021
var subSpan2 = filterQuerySubSpans[1].ToString();
2122
var relationship = GetRelationship(subSpan1);

src/JsonApiDotNetCore/Internal/SpanSplitter.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@ public readonly ref struct SpanSplitter
1515
public int Count => _substringIndexes.Count();
1616
public ReadOnlySpan<char> this[int index] => GetSpanForSubstring(index + 1);
1717

18-
public SpanSplitter(ref string str, char delimeter)
18+
private SpanSplitter(ref string str, char delimeter)
1919
{
2020
_span = str.AsSpan();
2121
_delimeterIndexes = str.IndexesOf(delimeter).ToList();
2222
_substringIndexes = new List<Tuple<int, int>>();
2323
BuildSubstringIndexes();
2424
}
2525

26+
public static SpanSplitter Split(string str, char delimeter)
27+
{
28+
return new SpanSplitter(ref str, delimeter);
29+
}
30+
2631
[EditorBrowsable(EditorBrowsableState.Never)]
2732
public override bool Equals(object obj) => throw new NotSupportedException();
2833

src/JsonApiDotNetCore/Middleware/RequestMiddleware.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Threading.Tasks;
3+
using JsonApiDotNetCore.Extensions;
34
using JsonApiDotNetCore.Internal;
45
using Microsoft.AspNetCore.Http;
56
using Microsoft.Extensions.Primitives;
@@ -56,7 +57,7 @@ private static bool IsValidAcceptHeader(HttpContext context)
5657
private static bool ContainsMediaTypeParameters(string mediaType)
5758
{
5859
const char delimeter = ';';
59-
var subSpans = new SpanSplitter(ref mediaType, delimeter);
60+
var subSpans = mediaType.SpanSplit(delimeter);
6061
if (subSpans.Count == 0) return false;
6162
return subSpans.Count == 2 && subSpans[0].ToString() == Constants.ContentType;
6263
}

src/JsonApiDotNetCore/Services/JsonApiContext.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Linq;
44
using JsonApiDotNetCore.Builders;
55
using JsonApiDotNetCore.Configuration;
6+
using JsonApiDotNetCore.Extensions;
67
using JsonApiDotNetCore.Internal;
78
using JsonApiDotNetCore.Internal.Generics;
89
using JsonApiDotNetCore.Internal.Query;
@@ -76,7 +77,7 @@ public IJsonApiContext ApplyContext<T>(object controller)
7677
BasePath = linkBuilder.GetBasePath(context, _controllerContext.RequestEntity.EntityName);
7778
PageManager = GetPageManager();
7879

79-
var pathSpans = new SpanSplitter(ref requestPath, '/');
80+
var pathSpans = requestPath.SpanSplit('/');
8081
IsRelationshipPath = pathSpans[pathSpans.Count - 2].ToString() == "relationships";
8182

8283
return this;

src/JsonApiDotNetCore/Services/QueryParser.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ protected virtual List<FilterQuery> ParseFilterQuery(string key, string value)
9999
var propertyNameSlice = key.AsSpan().Slice(openBracketIndex + 1, closedBracketIndex - openBracketIndex - 1);
100100
var propertyName = propertyNameSlice.ToString();
101101

102-
var spanSplitter = new SpanSplitter(ref value, COMMA);
102+
var spanSplitter = value.SpanSplit(COMMA);
103103
for (var i = 0; i < spanSplitter.Count; i++)
104104
{
105105
queries.Add(BuildFilterQuery(spanSplitter[i], propertyName));

test/UnitTests/Internal/SpanSplitterTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Text;
5+
using JsonApiDotNetCore.Extensions;
56
using JsonApiDotNetCore.Internal;
67
using Xunit;
78

@@ -88,7 +89,7 @@ protected void GivenStringWithCommaDelimeterAtBeginning()
8889
protected void WhenSplittingIntoSubstrings()
8990
{
9091
SpanSplitter spanSplitter;
91-
spanSplitter = new SpanSplitter(ref _baseString, _delimeter);
92+
spanSplitter = _baseString.SpanSplit(_delimeter);
9293
for (var i = 0; i < spanSplitter.Count; i++)
9394
{
9495
var span = spanSplitter[i];

0 commit comments

Comments
 (0)