64 lines
2.2 KiB
C#
64 lines
2.2 KiB
C#
using System;
|
|
|
|
namespace io.github.hatayama.uLoopMCP
|
|
{
|
|
internal static class JsonRpcRequestIdentityValidator
|
|
{
|
|
internal const string ServerSessionChangedMessage = "Unity CLI Loop server session changed. Retry the command.";
|
|
|
|
public static void Validate(
|
|
JsonRpcRequestUloopMetadata metadata,
|
|
string actualProjectRoot,
|
|
string actualServerSessionId)
|
|
{
|
|
if (metadata == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(metadata.ExpectedProjectRoot))
|
|
{
|
|
throw new ParameterValidationException("Invalid x-uloop metadata: expectedProjectRoot is required.");
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(metadata.ExpectedServerSessionId))
|
|
{
|
|
throw new ParameterValidationException("Invalid x-uloop metadata: expectedServerSessionId is required.");
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(actualProjectRoot))
|
|
{
|
|
throw new ParameterValidationException("Fast project validation is unavailable. Restart Unity CLI Loop and retry.");
|
|
}
|
|
|
|
if (string.IsNullOrWhiteSpace(actualServerSessionId))
|
|
{
|
|
throw new ParameterValidationException(ServerSessionChangedMessage);
|
|
}
|
|
|
|
if (!string.Equals(metadata.ExpectedProjectRoot, actualProjectRoot, StringComparison.Ordinal))
|
|
{
|
|
throw new ParameterValidationException("Connected Unity instance belongs to a different project.");
|
|
}
|
|
|
|
if (!string.Equals(metadata.ExpectedServerSessionId, actualServerSessionId, StringComparison.Ordinal))
|
|
{
|
|
throw new ParameterValidationException(ServerSessionChangedMessage);
|
|
}
|
|
}
|
|
|
|
internal static bool IsExpectedRetryableFailure(ParameterValidationException exception)
|
|
{
|
|
if (exception == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return string.Equals(
|
|
exception.Message,
|
|
ServerSessionChangedMessage,
|
|
StringComparison.Ordinal);
|
|
}
|
|
}
|
|
}
|