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