Skip to content

Commit

Permalink
- Removing unused code
Browse files Browse the repository at this point in the history
- Adding query format string
- Fixing some typos
  • Loading branch information
ladeak committed Oct 2, 2024
1 parent 52ce5c5 commit 3e32760
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 26 deletions.
39 changes: 14 additions & 25 deletions src/Http3Parts/UriBuilders/UriPathBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,13 @@ public ref struct UriPathInterpolatedStringHandler
{
private const char Slash = '/';
private const string Ordinal = "ordinal";
private const string Query = "query";
private const int GuessedLengthPerHole = 11;
private const int MinimumArrayPoolLength = 256;
private char[]? _arrayToReturnToPool;
private Span<char> _chars;
private int _pos;
private ReadOnlySpan<char> _baseUrl;
private ReadOnlySpan<char> _queryString;
private bool _isQuery = false;

public UriPathInterpolatedStringHandler(int literalLength, int formattedCount)
{
Expand All @@ -55,15 +55,6 @@ public UriPathInterpolatedStringHandler(int literalLength, int formattedCount, S
_pos = 0;
}

public UriPathInterpolatedStringHandler(int literalLength, int formattedCount, ReadOnlySpan<char> baseUrl, ReadOnlySpan<char> queryString)
{
_chars = _arrayToReturnToPool = ArrayPool<char>.Shared.Rent(GetDefaultLength(literalLength, formattedCount));
_arrayToReturnToPool = null;
_pos = 0;
_baseUrl = baseUrl;
_queryString = queryString;
}

public override string ToString() => new string(Text);

public string ToStringAndClear()
Expand Down Expand Up @@ -132,7 +123,6 @@ public void AppendLiteral(string value)
AppendFormatted(source);
}


[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void AppendFormatted<T>(T value)
{
Expand All @@ -143,6 +133,11 @@ public void AppendFormatted<T>(T value)
public void AppendFormatted<T>(T value, string? format)
{
string? s;
if (format == Query)
{
_isQuery = true;
format = Ordinal;
}
if (value is IFormattable)
{
if (value is ISpanFormattable spanFormattableValue)
Expand All @@ -151,14 +146,14 @@ public void AppendFormatted<T>(T value, string? format)
// However, most formatted values are the built-in types which do not emit a starting slash,
// Hence add a slash and remove it later if the formatted value written a slash too.
int charsWritten;
if (!TryResolveSlashes())
if (format != Ordinal && !TryResolveSlashes())
{
Grow();
var result = TryResolveSlashes();
Debug.Assert(result);
}

while (!spanFormattableValue.TryFormat(_chars.Slice(_pos), out charsWritten, format, null))
while (!spanFormattableValue.TryFormat(_chars.Slice(_pos), out charsWritten, format != Ordinal ? format : null, null))
Grow();

// Remove duplicate slashes _pos points to the first char of the formatted value.
Expand All @@ -183,7 +178,9 @@ public void AppendFormatted<T>(T value, string? format)
if (s is not null)
{
if (format == Ordinal)
{
AppendFormattedOrdinal(s.AsSpan());
}
else
AppendFormatted(s.AsSpan());
}
Expand Down Expand Up @@ -233,14 +230,6 @@ private void GrowAndAppend(scoped ReadOnlySpan<char> value)
_pos += value.Length;
}

private void GrowAndAppendOrdinal(scoped ReadOnlySpan<char> value)
{
var minRequired = value.Length + _pos;
Grow(minRequired);
value.CopyTo(_chars.Slice(_pos));
_pos += value.Length;
}

private void Grow()
{
var minRequired = _chars.Length * 2;
Expand All @@ -265,14 +254,14 @@ private void Grow(int requiredMinCapacity)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool DoesRequireSlash(scoped ReadOnlySpan<char> value)
{
return _pos > 0 && _chars[_pos - 1] != Slash && value[0] != Slash;
return _pos > 0 && _chars[_pos - 1] != Slash && value[0] != Slash && !_isQuery;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool TryResolveSlashes(scoped ReadOnlySpan<char> value)
{
// Ignore slashes at the beginning of string.
if (_pos <= 0)
if (_pos <= 0 || _isQuery)
return true;

var lastSlash = _chars[_pos - 1] == Slash;
Expand All @@ -292,7 +281,7 @@ private bool TryResolveSlashes(scoped ReadOnlySpan<char> value)
private bool TryResolveSlashes()
{
// Ignore slashes at the beginning of string.
if (_pos <= 0)
if (_pos <= 0 || _isQuery)
return true;

// Expectation if the user omits the last slash: it would come from the formatted value.
Expand Down
12 changes: 11 additions & 1 deletion tests/Http3Parts.Tests/UriPathBuilderTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ public void String()
Assert.Equal($"/a/{segment}", UriPathBuilder.Create($"/a/{segment}"));
Assert.Equal($"/{segment}", UriPathBuilder.Create($"/{segment}"));
Assert.Equal($"{segment}", UriPathBuilder.Create($"{segment}"));
Assert.Equal($"{segment}/?q0=1&q1=1", UriPathBuilder.Create($"{segment}?q0={segment:query}&q1={segment:query}"));
Assert.Equal($"{segment}/?q0=1&q1=1", UriPathBuilder.Create($"{segment}?q0={segment:query}&q1={segment}"));
Assert.Equal($"{segment}?q0=1&q1=1", UriPathBuilder.Create($"{segment}{'?':query}q0={segment}&q1={segment}"));
}

[Fact]
Expand Down Expand Up @@ -53,6 +56,9 @@ public void Int()
Assert.Equal($"/a/1", UriPathBuilder.Create($"/a{segment}"));
Assert.Equal($"/1", UriPathBuilder.Create($"/{segment}"));
Assert.Equal($"1", UriPathBuilder.Create($"{segment}"));
Assert.Equal($"1/?q=1", UriPathBuilder.Create($"{segment}?q={segment:query}"));
Assert.Equal($"1/?q=1&q1=1", UriPathBuilder.Create($"{segment}?q={segment:query}&q1={segment}"));
Assert.Equal($"1?q=1", UriPathBuilder.Create($"{segment}{'?':query}q={segment}"));
}

[Fact]
Expand All @@ -65,13 +71,17 @@ public void Double()
Assert.Equal($"/a/1", UriPathBuilder.Create($"/a{segment}"));
Assert.Equal($"/1", UriPathBuilder.Create($"/{segment}"));
Assert.Equal($"1", UriPathBuilder.Create($"{segment}"));
Assert.Equal($"1/?q=1", UriPathBuilder.Create($"{segment}?q={segment:query}"));
Assert.Equal($"1/?q=1&q1=1", UriPathBuilder.Create($"{segment}?q={segment:query}&q1={segment}"));
Assert.Equal($"1?q=1", UriPathBuilder.Create($"{segment}{'?':query}q={segment}"));
}

[Fact]
public void DoubleFormat()
{
double segment = 1;
Assert.Equal($"{BaseUrl}/a/{segment:0.00}/a", UriPathBuilder.Create($"{BaseUrl}/a/{segment:0.00}/a"));
Assert.Equal($"1?q={1:0.00}", UriPathBuilder.Create($"{segment}{'?':query}q={segment:0.00}"));
}

[Fact]
Expand All @@ -82,7 +92,7 @@ public void DateTime()
}

[Fact]
public void DateTimeFormatO()
public void DateTimeFormat()
{
DateTime segment = new DateTime(2024, 07, 21);
Assert.Equal($"{BaseUrl}/a/{segment:O}/a", UriPathBuilder.Create($"{BaseUrl}/a/{segment:O}/a"));
Expand Down

0 comments on commit 3e32760

Please sign in to comment.