Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
50 changes: 26 additions & 24 deletions src/Docker.DotNet/QueryString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,46 +21,48 @@ public QueryString(T value)
AttributedPublicProperties = FindAttributedPublicProperties<T, QueryStringParameterAttribute>();
}

public IDictionary<string, string[]> GetKeyValuePairs()
/// <summary>
/// Returns formatted query string.
/// </summary>
/// <returns></returns>
public string GetQueryString()
{
var queryParameters = new Dictionary<string, string[]>();
foreach (var pair in AttributedPublicProperties)
var queryStringBuilder = new StringBuilder();

foreach (var attributedProperty in AttributedPublicProperties)
{
var property = pair.Key;
var attribute = pair.Value;
var property = attributedProperty.Key;
var attribute = attributedProperty.Value;

var value = property.GetValue(Object, null);

// 'Required' check
if (attribute.IsRequired && value == null)
{
string propertyFullName = $"{property.DeclaringType?.FullName}.{property.Name}";
var propertyFullName = $"{property.DeclaringType?.FullName}.{property.Name}";
throw new ArgumentException("Got null/unset value for a required query parameter.", propertyFullName);
}

// Serialize
// Serialization
if (attribute.IsRequired || !IsDefaultOfType(value))
{
var keyStr = attribute.Name;
var valueStr = attribute.Convert(value!);
var queryParameterName = attribute.Name;

queryParameters[keyStr] = valueStr;
foreach (var queryParameterValue in attribute.Convert(value!))
{
if (queryStringBuilder.Length > 0)
{
queryStringBuilder.Append('&');
}

queryStringBuilder.Append(Uri.EscapeDataString(queryParameterName));
queryStringBuilder.Append('=');
queryStringBuilder.Append(Uri.EscapeDataString(queryParameterValue));
}
}
}

return queryParameters;
}

/// <summary>
/// Returns formatted query string.
/// </summary>
/// <returns></returns>
public string GetQueryString()
{
return string.Join("&",
GetKeyValuePairs().Select(
pair => string.Join("&",
pair.Value.Select(
v => $"{Uri.EscapeDataString(pair.Key)}={Uri.EscapeDataString(v)}"))));
return queryStringBuilder.ToString();
}

private static Dictionary<PropertyInfo, TAttribType> FindAttributedPublicProperties<
Expand Down
2 changes: 1 addition & 1 deletion src/Docker.DotNet/QueryStringBoolParameterAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace Docker.DotNet;

internal sealed class QueryStringBoolParameterAttribute(string name, bool required) : QueryStringParameterAttribute(name, required)
{
public override string[] Convert(object value)
public override IEnumerable<string> Convert(object value)
{
Debug.Assert(value != null);

Expand Down
4 changes: 2 additions & 2 deletions src/Docker.DotNet/QueryStringListParameterAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace Docker.DotNet;

internal sealed class QueryStringListParameterAttribute(string name, bool required) : QueryStringParameterAttribute(name, required)
{
public override string[] Convert(object value)
public override IEnumerable<string> Convert(object value)
{
Debug.Assert(value != null);
Debug.Assert(value is IList<string>);
Expand All @@ -12,6 +12,6 @@ public override string[] Convert(object value)
throw new ArgumentException($"Expected value of type '{typeof(IList<string>)}'.", nameof(value));
}

return typedValue.ToArray();
return typedValue;
}
}
2 changes: 1 addition & 1 deletion src/Docker.DotNet/QueryStringMapParameterAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace Docker.DotNet;

internal sealed class QueryStringMapParameterAttribute<T>(string name, bool required) : QueryStringParameterAttribute(name, required)
{
public override string[] Convert(object value)
public override IEnumerable<string> Convert(object value)
{
Debug.Assert(value != null);
Debug.Assert(value is T);
Expand Down
2 changes: 1 addition & 1 deletion src/Docker.DotNet/QueryStringParameterAttribute.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ internal class QueryStringParameterAttribute : Attribute

public bool IsRequired { get; private set; }

public virtual string[] Convert(object value) => [value.ToString()!];
public virtual IEnumerable<string> Convert(object value) => [value.ToString()!];

public QueryStringParameterAttribute(string name, bool required)
{
Expand Down