Skip to content

Commit

Permalink
add optional type parameters for endpoints to specify custom return type
Browse files Browse the repository at this point in the history
  • Loading branch information
Cytraen committed Feb 25, 2022
1 parent e6c6fea commit a56f36e
Show file tree
Hide file tree
Showing 14 changed files with 1,284 additions and 23 deletions.
59 changes: 36 additions & 23 deletions BungieSharper.CodeGen/Generation/GeneratePath.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,36 +67,38 @@ public static string GeneratePathContent(string path, PathObject pathDef)
switch (param.In)
{
case ParameterInEnum.Query:
{
var name = param.Name;
var escapedParamEntry = "";
if (paramTypeText.StartsWith("string"))
{
escapedParamEntry = $"Uri.EscapeDataString({name})";
var name = param.Name;
var escapedParamEntry = "";
if (paramTypeText.StartsWith("string"))
{
escapedParamEntry = $"Uri.EscapeDataString({name})";
}
if (paramTypeText.StartsWith("IEnumerable<"))
{
escapedParamEntry = $"string.Join(\",\", {name}.Select(x => x.ToString()))";
}

if (param.Required != true)
{
var textParam = $"{name} != null ? $\"{name}={{{escapedParamEntry}}}\" : null";
queryParamTextList.Add(textParam);
}
else
{
var textParam = $"$\"{name}={{{escapedParamEntry}}}\"";
queryParamTextList.Add(textParam);
}

break;
}
if (paramTypeText.StartsWith("IEnumerable<"))
{
escapedParamEntry = $"string.Join(\",\", {name}.Select(x => x.ToString()))";
}

if (param.Required != true)
{
var textParam = $"{name} != null ? $\"{name}={{{escapedParamEntry}}}\" : null";
queryParamTextList.Add(textParam);
}
else
{
var textParam = $"$\"{name}={{{escapedParamEntry}}}\"";
queryParamTextList.Add(textParam);
}

break;
}
case ParameterInEnum.Path when paramTypeText.StartsWith("string"):
path = path.Replace($"{{{param.Name}}}", $"{{Uri.EscapeDataString({param.Name})}}");
break;

case ParameterInEnum.Path:
break;

case ParameterInEnum.Header:
throw new NotSupportedException();
case ParameterInEnum.None:
Expand Down Expand Up @@ -160,6 +162,17 @@ public static string GeneratePathContent(string path, PathObject pathDef)
content += $" {(responseMethodInfo.RequestBody != null ? "new StringContent(JsonSerializer.Serialize(requestBody), System.Text.Encoding.UTF8, \"application/json\")" : "null")}, HttpMethod.{httpMethod}, authToken, cancelToken\n";
content += " );\n }";

content += "\n\n";

content += $" /// <inheritdoc cref=\"{pathName}({string.Join(", ", declareParams.Select(x => x.Split(' ').First()))})\" />\n";
content += $" /// <typeparam name=\"T\">The custom type to deserialize to.</typeparam>\n";
content += $" public Task<T> {pathName}<T>({string.Join(", ", declareParams)})\n {{\n";
content += $" return _apiAccessor.ApiRequestAsync<T>(\n";
content += $" new Uri($\"{path.TrimStart('/')}\"{queryStringParamFinal}, UriKind.Relative),\n";

content += $" {(responseMethodInfo.RequestBody != null ? "new StringContent(JsonSerializer.Serialize(requestBody), System.Text.Encoding.UTF8, \"application/json\")" : "null")}, HttpMethod.{httpMethod}, authToken, cancelToken\n";
content += " );\n }";

return content.Replace("System.DateTime", "DateTime");
}

Expand Down
18 changes: 18 additions & 0 deletions BungieSharper.Tests/BaseTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,23 @@ public async Task PostUserSearchTest()
Assert.Equal(expectedDisplayName, userCard.BungieGlobalDisplayName);
Assert.Equal(expectedDisplayNameCode, userCard.BungieGlobalDisplayNameCode);
}

[Fact]
public async Task GetDefinitionTest()
{
const uint expectedCollectibleHash = 1296095691;
const uint expectedBucketTypeHash = 1498876634;
const uint expectedInfusionCategoryHash = 2601628231;
const uint expectedDamageTypeHash = 3373582085;
const string expectedName = "Midnight Coup";

var actualDefinition = await ClientFixture.TestClient.Api.Destiny2_GetDestinyEntityDefinition<Entities.Destiny.Definitions.DestinyInventoryItemDefinition>("DestinyInventoryItemDefinition", 1128225405);

Assert.Equal(expectedCollectibleHash, actualDefinition.CollectibleHash);
Assert.Equal(expectedBucketTypeHash, actualDefinition.Inventory.BucketTypeHash);
Assert.Equal(expectedInfusionCategoryHash, actualDefinition.Quality.InfusionCategoryHash);
Assert.Equal(expectedDamageTypeHash, Assert.Single(actualDefinition.DamageTypeHashes));
Assert.Equal(expectedName, actualDefinition.DisplayProperties.Name);
}
}
}
20 changes: 20 additions & 0 deletions BungieSharper/Endpoints/Application.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,16 @@ public partial class Endpoints
);
}

/// <inheritdoc cref="App_GetApplicationApiUsage(int, DateTime?, DateTime?, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> App_GetApplicationApiUsage<T>(int applicationId, DateTime? end = null, DateTime? start = null, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"App/ApiUsage/{applicationId}/" + HttpRequestGenerator.MakeQuerystring(end != null ? $"end={end}" : null, start != null ? $"start={start}" : null), UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Get list of applications created by Bungie.
/// </summary>
Expand All @@ -38,5 +48,15 @@ public partial class Endpoints
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <inheritdoc cref="App_GetBungieApplications(string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> App_GetBungieApplications<T>(string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"App/FirstParty/", UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}
}
}
10 changes: 10 additions & 0 deletions BungieSharper/Endpoints/CommunityContent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,15 @@ public partial class Endpoints
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <inheritdoc cref="CommunityContent_GetCommunityContent(Entities.Forum.ForumTopicsCategoryFiltersEnum, int, Entities.Forum.CommunityContentSortMode, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> CommunityContent_GetCommunityContent<T>(Entities.Forum.ForumTopicsCategoryFiltersEnum mediaFilter, int page, Entities.Forum.CommunityContentSortMode sort, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"CommunityContent/Get/{sort}/{mediaFilter}/{page}/", UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}
}
}
60 changes: 60 additions & 0 deletions BungieSharper/Endpoints/Content.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,16 @@ public partial class Endpoints
);
}

/// <inheritdoc cref="Content_GetContentType(string, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> Content_GetContentType<T>(string type, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"Content/GetContentType/{Uri.EscapeDataString(type)}/", UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Returns a content item referenced by id
/// </summary>
Expand All @@ -35,6 +45,16 @@ public partial class Endpoints
);
}

/// <inheritdoc cref="Content_GetContentById(long, string, bool?, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> Content_GetContentById<T>(long id, string locale, bool? head = null, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"Content/GetContentById/{id}/{Uri.EscapeDataString(locale)}/" + HttpRequestGenerator.MakeQuerystring(head != null ? $"head={head}" : null), UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Returns the newest item that matches a given tag and Content Type.
/// </summary>
Expand All @@ -49,6 +69,16 @@ public partial class Endpoints
);
}

/// <inheritdoc cref="Content_GetContentByTagAndType(string, string, string, bool?, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> Content_GetContentByTagAndType<T>(string locale, string tag, string type, bool? head = null, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"Content/GetContentByTagAndType/{Uri.EscapeDataString(tag)}/{Uri.EscapeDataString(type)}/{Uri.EscapeDataString(locale)}/" + HttpRequestGenerator.MakeQuerystring(head != null ? $"head={head}" : null), UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Gets content based on querystring information passed in. Provides basic search and text search capabilities.
/// </summary>
Expand All @@ -68,6 +98,16 @@ public partial class Endpoints
);
}

/// <inheritdoc cref="Content_SearchContentWithText(string, string?, int?, bool?, string?, string?, string?, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> Content_SearchContentWithText<T>(string locale, string? ctype = null, int? currentpage = null, bool? head = null, string? searchtext = null, string? source = null, string? tag = null, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"Content/Search/{Uri.EscapeDataString(locale)}/" + HttpRequestGenerator.MakeQuerystring(ctype != null ? $"ctype={Uri.EscapeDataString(ctype)}" : null, currentpage != null ? $"currentpage={currentpage}" : null, head != null ? $"head={head}" : null, searchtext != null ? $"searchtext={Uri.EscapeDataString(searchtext)}" : null, source != null ? $"source={Uri.EscapeDataString(source)}" : null, tag != null ? $"tag={Uri.EscapeDataString(tag)}" : null), UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Searches for Content Items that match the given Tag and Content Type.
/// </summary>
Expand All @@ -84,6 +124,16 @@ public partial class Endpoints
);
}

/// <inheritdoc cref="Content_SearchContentByTagAndType(string, string, string, int?, bool?, int?, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> Content_SearchContentByTagAndType<T>(string locale, string tag, string type, int? currentpage = null, bool? head = null, int? itemsperpage = null, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"Content/SearchContentByTagAndType/{Uri.EscapeDataString(tag)}/{Uri.EscapeDataString(type)}/{Uri.EscapeDataString(locale)}/" + HttpRequestGenerator.MakeQuerystring(currentpage != null ? $"currentpage={currentpage}" : null, head != null ? $"head={head}" : null, itemsperpage != null ? $"itemsperpage={itemsperpage}" : null), UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Search for Help Articles.
/// </summary>
Expand All @@ -96,5 +146,15 @@ public Task<object> Content_SearchHelpArticles(string searchtext, string size, s
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <inheritdoc cref="Content_SearchHelpArticles(string, string, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> Content_SearchHelpArticles<T>(string searchtext, string size, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"Content/SearchHelpArticles/{Uri.EscapeDataString(searchtext)}/{Uri.EscapeDataString(size)}/", UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}
}
}
40 changes: 40 additions & 0 deletions BungieSharper/Endpoints/Core.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,16 @@ public Task<Dictionary<string, string>> GetAvailableLocales(string? authToken =
);
}

/// <inheritdoc cref="GetAvailableLocales(string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> GetAvailableLocales<T>(string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"GetAvailableLocales/", UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Get the common settings used by the Bungie.Net environment.
/// </summary>
Expand All @@ -35,6 +45,16 @@ public Task<Dictionary<string, string>> GetAvailableLocales(string? authToken =
);
}

/// <inheritdoc cref="GetCommonSettings(string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> GetCommonSettings<T>(string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"Settings/", UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Get the user-specific system overrides that should be respected alongside common systems.
/// </summary>
Expand All @@ -48,6 +68,16 @@ public Task<Dictionary<string, string>> GetAvailableLocales(string? authToken =
);
}

/// <inheritdoc cref="GetUserSystemOverrides(string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> GetUserSystemOverrides<T>(string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"UserSystemOverrides/", UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <summary>
/// Gets any active global alert for display in the forum banners, help pages, etc. Usually used for DOC alerts.
/// </summary>
Expand All @@ -61,5 +91,15 @@ public Task<Dictionary<string, string>> GetAvailableLocales(string? authToken =
null, HttpMethod.Get, authToken, cancelToken
);
}

/// <inheritdoc cref="GetGlobalAlerts(bool?, string?, CancellationToken)" />
/// <typeparam name="T">The custom type to deserialize to.</typeparam>
public Task<T> GetGlobalAlerts<T>(bool? includestreaming = null, string? authToken = null, CancellationToken cancelToken = default)
{
return _apiAccessor.ApiRequestAsync<T>(
new Uri($"GlobalAlerts/" + HttpRequestGenerator.MakeQuerystring(includestreaming != null ? $"includestreaming={includestreaming}" : null), UriKind.Relative),
null, HttpMethod.Get, authToken, cancelToken
);
}
}
}
Loading

0 comments on commit a56f36e

Please sign in to comment.