diff --git a/QuickChart/QuickChart.cs b/QuickChart/QuickChart.cs index 01d16e6..a914717 100644 --- a/QuickChart/QuickChart.cs +++ b/QuickChart/QuickChart.cs @@ -3,192 +3,177 @@ using System.Net.Http; using System.Text; using System.Text.Json; using System.IO; +using System.Text.Json.Serialization; -namespace QuickChart +namespace QuickChart; + +internal class QuickChartShortUrlResponse { - internal class QuickChartShortUrlResponse - { #pragma warning disable IDE1006 // Naming Styles - public bool status { get; set; } - public string url { get; set; } + public bool status { get; set; } + public string url { get; set; } #pragma warning restore IDE1006 // Naming Styles - } +} - public class Chart +public class Chart +{ + public int Width { get; set; } + public int Height { get; set; } + public double DevicePixelRatio { get; set; } + public string Format { get; set; } + public string BackgroundColor { get; set; } + public string Key { get; set; } + public string Version { get; set; } + public string Config { get; set; } + + public string Scheme { get; set; } + public string Host { get; set; } + public int Port { get; set; } + + private static readonly HttpClient Client = new(); + + public Chart(string scheme = null, string host = null, int? port = null) { - public int Width { get; set; } - public int Height { get; set; } - public double DevicePixelRatio { get; set; } - public string Format { get; set; } - public string BackgroundColor { get; set; } - public string Key { get; set; } - public string Version { get; set; } - public string Config { get; set; } + this.Width = 500; + this.Height = 300; + this.DevicePixelRatio = 1.0; + this.Format = "png"; + this.BackgroundColor = "transparent"; - public string Scheme { get; set; } - public string Host { get; set; } - public int Port { get; set; } - - private static readonly HttpClient Client = new HttpClient(); - - public Chart(string scheme = null, string host = null, int? port = null) + if (host != null) { - Width = 500; - Height = 300; - DevicePixelRatio = 1.0; - Format = "png"; - BackgroundColor = "transparent"; - - if (host != null) + this.Host = host; + if (scheme != null) { - Host = host; - if (scheme != null) - { - Scheme = scheme; - if (port.HasValue) - { - Port = port.Value; - } - else - { - if(scheme == "http") - { - Port = 80; - } - else - { - Port = 443; - } - } - } - else - { - Scheme = "https"; - Port = 443; - } + this.Scheme = scheme; + this.Port = port ?? (scheme == "http" ? 80 : 443); } else { - Scheme = "https"; - Host = "quickchart.io"; - Port = 443; + this.Scheme = "https"; + this.Port = 443; } } - - public string GetUrl() + else { - if (Config == null) - { - throw new NullReferenceException("You must set Config on the QuickChart object before generating a URL"); - } - - StringBuilder builder = new StringBuilder(); - builder.Append("w=").Append(Width.ToString()); - builder.Append("&h=").Append(Height.ToString()); - - builder.Append("&devicePixelRatio=").Append(DevicePixelRatio.ToString()); - builder.Append("&f=").Append(Format); - builder.Append("&bkg=").Append(Uri.EscapeDataString(BackgroundColor)); - builder.Append("&c=").Append(Uri.EscapeDataString(Config)); - if (!string.IsNullOrEmpty(Key)) - { - builder.Append("&key=").Append(Uri.EscapeDataString(Key)); - } - if (!string.IsNullOrEmpty(Version)) - { - builder.Append("&v=").Append(Uri.EscapeDataString(Version)); - } - - return $"{Scheme}://{Host}:{Port}/chart?{builder}"; - } - - public string GetShortUrl() - { - if (Config == null) - { - throw new NullReferenceException("You must set Config on the QuickChart object before generating a URL"); - } - - JsonSerializerOptions options = new JsonSerializerOptions(); - options.IgnoreNullValues = true; - - String json = JsonSerializer.Serialize(new - { - width = Width, - height = Height, - backgroundColor = BackgroundColor, - devicePixelRatio = DevicePixelRatio, - format = Format, - chart = Config, - key = Key, - version = Version, - }, options); - - string url = $"{Scheme}://{Host}:{Port}/chart/create"; - - HttpResponseMessage response = Client.PostAsync( - url, - new StringContent(json, Encoding.UTF8, "application/json") - ).Result; - - if (!response.IsSuccessStatusCode) - { - throw new ApiException("Unsuccessful response from API", response); - } - - string responseText = response.Content.ReadAsStringAsync().Result; - QuickChartShortUrlResponse result = JsonSerializer.Deserialize(responseText); - return result.url; - } - - public byte[] ToByteArray() - { - if (Config == null) - { - throw new NullReferenceException("You must set Config on the QuickChart object before generating a URL"); - } - - JsonSerializerOptions options = new JsonSerializerOptions(); - options.IgnoreNullValues = true; - - String json = JsonSerializer.Serialize(new - { - width = Width, - height = Height, - backgroundColor = BackgroundColor, - devicePixelRatio = DevicePixelRatio, - format = Format, - chart = Config, - key = Key, - version = Version, - }, options); - - string url = $"{Scheme}://{Host}:{Port}/chart"; - - HttpResponseMessage response = Client.PostAsync( - url, - new StringContent(json, Encoding.UTF8, "application/json") - ).Result; - - if (!response.IsSuccessStatusCode) - { - throw new ApiException("Unsuccessful response from API", response); - } - - return response.Content.ReadAsByteArrayAsync().Result; - } - - public void ToFile(string filePath) - { - File.WriteAllBytes(filePath, this.ToByteArray()); + this.Scheme = "https"; + this.Host = "quickchart.io"; + this.Port = 443; } } - public class ApiException : Exception + public string GetUrl() { - public ApiException(string message, HttpResponseMessage response) : base(message) - => this.Response = response; + if (this.Config == null) + { + throw new NullReferenceException("You must set Config on the QuickChart object before generating a URL"); + } - public HttpResponseMessage Response { get; private set; } + var builder = new StringBuilder(); + _ = builder.Append("w=").Append(this.Width); + _ = builder.Append("&h=").Append(this.Height); + + _ = builder.Append("&devicePixelRatio=").Append(this.DevicePixelRatio); + _ = builder.Append("&f=").Append(this.Format); + _ = builder.Append("&bkg=").Append(Uri.EscapeDataString(this.BackgroundColor)); + _ = builder.Append("&c=").Append(Uri.EscapeDataString(this.Config)); + if (!string.IsNullOrEmpty(this.Key)) + { + _ = builder.Append("&key=").Append(Uri.EscapeDataString(this.Key)); + } + if (!string.IsNullOrEmpty(this.Version)) + { + _ = builder.Append("&v=").Append(Uri.EscapeDataString(this.Version)); + } + + return $"{this.Scheme}://{this.Host}:{this.Port}/chart?{builder}"; } + + public string GetShortUrl() + { + if (this.Config == null) + { + throw new NullReferenceException("You must set Config on the QuickChart object before generating a URL"); + } + + var options = new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + + var json = JsonSerializer.Serialize(new + { + width = this.Width, + height = this.Height, + backgroundColor = this.BackgroundColor, + devicePixelRatio = this.DevicePixelRatio, + format = this.Format, + chart = this.Config, + key = this.Key, + version = this.Version, + }, options); + + var url = $"{this.Scheme}://{this.Host}:{this.Port}/chart/create"; + + var response = Client.PostAsync( + url, + new StringContent(json, Encoding.UTF8, "application/json") + ).Result; + + if (!response.IsSuccessStatusCode) + { + throw new ApiException("Unsuccessful response from API", response); + } + + var responseText = response.Content.ReadAsStringAsync().Result; + var result = JsonSerializer.Deserialize(responseText); + return result.url; + } + + public byte[] ToByteArray() + { + if (this.Config == null) + { + throw new NullReferenceException("You must set Config on the QuickChart object before generating a URL"); + } + + var options = new JsonSerializerOptions + { + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull + }; + + var json = JsonSerializer.Serialize(new + { + width = this.Width, + height = this.Height, + backgroundColor = this.BackgroundColor, + devicePixelRatio = this.DevicePixelRatio, + format = this.Format, + chart = this.Config, + key = this.Key, + version = this.Version, + }, options); + + var url = $"{this.Scheme}://{this.Host}:{this.Port}/chart"; + + var response = Client.PostAsync( + url, + new StringContent(json, Encoding.UTF8, "application/json") + ).Result; + + return !response.IsSuccessStatusCode + ? throw new ApiException("Unsuccessful response from API", response) + : response.Content.ReadAsByteArrayAsync().Result; + } + + public void ToFile(string filePath) + => File.WriteAllBytes(filePath, this.ToByteArray()); +} + +public class ApiException : Exception +{ + public ApiException(string message, HttpResponseMessage response) : base(message) + => this.Response = response; + + public HttpResponseMessage Response { get; private set; } } diff --git a/QuickChart/QuickChart.csproj b/QuickChart/QuickChart.csproj index 2e5933a..a0a9dd5 100644 --- a/QuickChart/QuickChart.csproj +++ b/QuickChart/QuickChart.csproj @@ -2,23 +2,27 @@ Library - net9.0 + net8.0 + x64 + Debug;Release;x64 + AnyCPU;x64 true - Ian Webster - Ian Webster + Ian Webster, TheXorog + Ian Webster, TheXorog MIT QuickChart - https://github.com/typpo/quickchart-csharp + https://github.com/TheXorog/quickchart-csharp Client library for the QuickChart Chart API, used to generate chart images. chart image, chart api, chart, charts, image charts QuickChart Client library for the QuickChart Chart API, used to generate chart images. 2.3.0 QuickChart + False - +