using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.Localization;
namespace Sozsoft.Mcp;
///
/// Aracin modelle konusarak cozulecek reddi: eksik ya da hatali girdi, durum kurali, eksik yetki.
/// Istisna olarak atilmaz — bu durum aracin beklenen cevabidir; atilan istisna debugger'i durdurur
/// ve SDK'da hata logu uretir. Istemciye hata sonucu (IsError) olarak gider, model mesaji
/// okuyup girdiyi duzeltir ve tekrar dener.
///
public sealed record McpProblem(string Message)
{
public static McpProblem From(IStringLocalizer localizer, string name, params object[] arguments)
=> new(localizer[name, arguments]);
}
/// Aracin degeri ya da 'i; ikisi birden olmaz.
public readonly struct McpOutcome
{
private McpOutcome(T? value, McpProblem? problem)
{
Value = value;
Problem = problem;
}
public T? Value { get; }
public McpProblem? Problem { get; }
public bool TryGetValue([MaybeNullWhen(false)] out T value, [NotNullWhen(false)] out McpProblem? problem)
{
value = Value!;
problem = Problem;
return problem is null;
}
public static implicit operator McpOutcome(T value) => new(value, null);
public static implicit operator McpOutcome(McpProblem problem) => new(default, problem);
}
/// Yetki reddi mesajinda yetkinin gorunen adi ve kodu; rol ekraninda aranabilsin diye kod her zaman yazilir.
public static class McpPermissionText
{
public static string Describe(IStringLocalizer localizer, string permissionName)
{
var displayName = localizer[permissionName];
return displayName.ResourceNotFound || displayName.Value == permissionName
? permissionName
: $"{displayName.Value} ({permissionName})";
}
}