Перевести реализации интерфейсов на явные (§11, вариант A)

Codemod scripts/make_explicit.py: 161 член в 30 прод-файлах конвертирован в
вид "Тип IFoo.Член" (частичные классы и многострочные сигнатуры учтены; Card и
ICard-семейство — DTO, оставлены implicit). Потребители, дёргавшие классы
напрямую, перетипизированы на интерфейсы: 8 мест в проде (самовызовы через
((ISessionClient)this), снят дефолт параметра в явной реализации) и 17 тестовых
файлов (поля, tuple-деконструкции, var/target-typed new). Build 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
This commit is contained in:
Rustam Khalimov
2026-09-11 20:16:06 +03:00
parent 355723f4ad
commit 206d61068a
48 changed files with 516 additions and 250 deletions
@@ -7,6 +7,7 @@ using Deal.Grpc.Telegram;
using Deal.Telegram.Sessions;
using Grpc.Core;
using Grpc.Net.Client;
using Deal.Telegram.Core;
namespace Deal.Telegram.Core;
@@ -44,7 +45,7 @@ public sealed class CoreIngressClient : ICoreIngressClient
}
/// <inheritdoc />
public async Task<PushSourceReply> PushSourceAsync(
async Task<PushSourceReply> ICoreIngressClient.PushSourceAsync(
string tenantId,
PushSourceRequest request,
CancellationToken cancellationToken)
@@ -61,7 +62,7 @@ public sealed class CoreIngressClient : ICoreIngressClient
}
/// <inheritdoc />
public async Task<IReadOnlyList<string>> SyncDialogsAsync(
async Task<IReadOnlyList<string>> ICoreIngressClient.SyncDialogsAsync(
string tenantId,
IReadOnlyList<DialogEntry> entries,
CancellationToken cancellationToken)
@@ -1,3 +1,4 @@
using Deal.Telegram.Dialogs;
namespace Deal.Telegram.Dialogs;
/// <summary>
@@ -6,7 +7,7 @@ namespace Deal.Telegram.Dialogs;
public sealed class RandomBackfillPacer : IBackfillPacer
{
/// <inheritdoc />
public async Task WaitAsync(
async Task IBackfillPacer.WaitAsync(
double minSeconds,
double maxSeconds,
CancellationToken cancellationToken)
@@ -1,3 +1,4 @@
using Deal.Telegram.Telegram;
namespace Deal.Telegram.Telegram;
/// <summary>
@@ -6,7 +7,7 @@ namespace Deal.Telegram.Telegram;
public sealed class ClientFactory : ITelegramClientFactory
{
/// <inheritdoc />
public ISessionClient Create(
ISessionClient ITelegramClientFactory.Create(
int apiId,
string apiHash,
byte[]? storedSession)
@@ -5,6 +5,7 @@ using Grpc.Core;
using TL;
using WTelegram;
using RpcException = TL.RpcException;
using Deal.Telegram.Telegram;
namespace Deal.Telegram.Telegram;
@@ -82,7 +83,7 @@ public sealed class WTelegramSessionClient : ISessionClient
public byte[]? SessionBytes => Volatile.Read(ref _latestSessionBytes);
/// <inheritdoc />
public async Task ConnectAsync(CancellationToken cancellationToken)
async Task ISessionClient.ConnectAsync(CancellationToken cancellationToken)
{
if (IsConnected)
{
@@ -94,7 +95,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task RequestCodeAsync(string phone, CancellationToken cancellationToken)
async Task ISessionClient.RequestCodeAsync(string phone, CancellationToken cancellationToken)
{
_phone = phone;
_phoneCodeHash = null;
@@ -118,7 +119,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task<string?> SubmitCodeAsync(string code, CancellationToken cancellationToken)
async Task<string?> ISessionClient.SubmitCodeAsync(string code, CancellationToken cancellationToken)
{
if (_phoneAlreadyAuthorized)
{
@@ -158,7 +159,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task SubmitPasswordAsync(string password, CancellationToken cancellationToken)
async Task ISessionClient.SubmitPasswordAsync(string password, CancellationToken cancellationToken)
{
try
{
@@ -178,7 +179,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task StartQrAsync(Action<string> onQrUrl, CancellationToken cancellationToken)
async Task ISessionClient.StartQrAsync(Action<string> onQrUrl, CancellationToken cancellationToken)
{
try
{
@@ -196,13 +197,13 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task LogOutAsync(CancellationToken cancellationToken)
async Task ISessionClient.LogOutAsync(CancellationToken cancellationToken)
{
await _client.Auth_LogOut().WaitAsync(cancellationToken).ConfigureAwait(false);
}
/// <inheritdoc />
public async Task<string> GetAccountAsync(CancellationToken cancellationToken)
async Task<string> ISessionClient.GetAccountAsync(CancellationToken cancellationToken)
{
UserBase[] users = await _client.Users_GetUsers(InputUser.Self).WaitAsync(cancellationToken).ConfigureAwait(false);
string username = users.OfType<User>().FirstOrDefault()?.username ?? string.Empty;
@@ -221,7 +222,7 @@ public sealed class WTelegramSessionClient : ISessionClient
public event Func<TelegramMessage, Task>? MessageReceived;
/// <inheritdoc />
public async Task<IReadOnlyList<TelegramDialog>> GetDialogsAsync(int limit, CancellationToken cancellationToken)
async Task<IReadOnlyList<TelegramDialog>> ISessionClient.GetDialogsAsync(int limit, CancellationToken cancellationToken)
{
Messages_DialogsBase result = await RunTlCallAsync(() => _client.Messages_GetDialogs(limit: limit), cancellationToken).ConfigureAwait(false);
(DialogBase[] dialogs, Dictionary<long, ChatBase> chats, Dictionary<long, User> users) = UnpackDialogs(result);
@@ -241,7 +242,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task<IReadOnlyList<TelegramMessage>> GetMessagesAsync(
async Task<IReadOnlyList<TelegramMessage>> ISessionClient.GetMessagesAsync(
string dialogId,
int limit,
CancellationToken cancellationToken)
@@ -265,7 +266,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task<TelegramMessage?> GetMessageAsync(
async Task<TelegramMessage?> ISessionClient.GetMessageAsync(
string dialogId,
long msgId,
CancellationToken cancellationToken)
@@ -295,7 +296,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task MarkReadAsync(string dialogId, CancellationToken cancellationToken)
async Task ISessionClient.MarkReadAsync(string dialogId, CancellationToken cancellationToken)
{
InputPeer peer = await ResolvePeerAsync(dialogId, cancellationToken).ConfigureAwait(false);
await RunTlCallAsync(() => _client.ReadHistory(peer), cancellationToken).ConfigureAwait(false);
@@ -303,7 +304,7 @@ public sealed class WTelegramSessionClient : ISessionClient
/// <inheritdoc />
public async Task<IReadOnlyList<TelegramDialog>> SearchAsync(
async Task<IReadOnlyList<TelegramDialog>> ISessionClient.SearchAsync(
string query,
int limit,
CancellationToken cancellationToken)
@@ -327,7 +328,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task<TelegramSourceInfo> GetInfoAsync(string dialogId, CancellationToken cancellationToken)
async Task<TelegramSourceInfo> ISessionClient.GetInfoAsync(string dialogId, CancellationToken cancellationToken)
{
TelegramSourceInfo unknown = DefaultSourceInfo(dialogId);
if (!TryParseSignedId(dialogId, out bool isChannel, out bool isChat, out bool isUser, out long rawId))
@@ -361,7 +362,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task<DiscoveryReadResult> ReadForEvalAsync(
async Task<DiscoveryReadResult> ISessionClient.ReadForEvalAsync(
string dialogId,
int limit,
CancellationToken cancellationToken)
@@ -410,7 +411,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task JoinAsync(string username, CancellationToken cancellationToken)
async Task ISessionClient.JoinAsync(string username, CancellationToken cancellationToken)
{
Contacts_ResolvedPeer resolved = await RunTlCallAsync(() => _client.Contacts_ResolveUsername(username), cancellationToken).ConfigureAwait(false);
CacheEntities(resolved.chats.Values, resolved.users.Values);
@@ -425,7 +426,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
/// <inheritdoc />
public async Task LeaveAsync(string dialogId, CancellationToken cancellationToken)
async Task ISessionClient.LeaveAsync(string dialogId, CancellationToken cancellationToken)
{
if (!TryParseSignedId(dialogId, out bool isChannel, out _, out _, out long rawId) || !isChannel)
{
@@ -923,7 +924,7 @@ public sealed class WTelegramSessionClient : ISessionClient
// Канал/пользователь без access_hash (рестарт/новый источник): доливаем сущности
// первой страницей списка диалогов — каталог ядра строится из неё же (лимит 500, как refresh).
await GetDialogsAsync(DialogResolvePageSize, cancellationToken).ConfigureAwait(false);
await ((ISessionClient)this).GetDialogsAsync(DialogResolvePageSize, cancellationToken).ConfigureAwait(false);
return BuildPeer(isChannel, isChat, isUser, rawId)
?? throw new SessionException(StatusCode.InvalidArgument, SessionErrorMessages.UnknownDialog);
}
@@ -945,7 +946,7 @@ public sealed class WTelegramSessionClient : ISessionClient
}
}
await GetDialogsAsync(DialogResolvePageSize, cancellationToken).ConfigureAwait(false);
await ((ISessionClient)this).GetDialogsAsync(DialogResolvePageSize, cancellationToken).ConfigureAwait(false);
lock (_entityCacheGate)
{
return _entityAccessHashes.TryGetValue(dialogId, out long accessHash)