using GraphQL; using GraphQL.Client.Http; using Speckle.Sdk.Api.GraphQL.Models.Responses; namespace Speckle.Sdk.Api.GraphQL; public static class GraphQLHttpClientExtensions { /// /// Gets the version of the current server. Useful for guarding against unsupported api calls on newer or older servers. /// /// /// Expects the response to either be
/// - 1. The literal string dev, which will return 999.999.999
/// - 2. A 3 numeral semver (anything after the first - character will be ignored)
///
/// /// A 3 numeral object (e.g. 2.21.3.alpha123 becomes 2.21.3) /// /// Server responded with a server version, but it was not in an expected format public static async Task GetServerVersion( this GraphQLHttpClient client, CancellationToken cancellationToken = default ) { //lang=graphql const string QUERY = """ query Server { data:serverInfo { data:version } } """; var request = new GraphQLRequest { Query = QUERY }; var response = await client .SendQueryAsync>>(request, cancellationToken) .ConfigureAwait(false); response.EnsureGraphQLSuccess(); string versionString = response.Data.data.data; //Local server builds will have a non-numerical version string if (versionString == "dev" || versionString == "custom") { return new Version(999, 999, 999); } string? semverString = versionString.Split('-').First(); if (Version.TryParse(semverString!, out Version? semver)) { return semver; } else { throw new FormatException($"Server responded with an invalid semver string \"{semverString}\""); } } }