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}\"");
}
}
}