Mikhαil
🤔
Mikhαil
Или интерфейс
Mikhαil
Или ты ответы от других обрабатываешь
Anatoly
ткни носом
операция возвращает Result { Ok, Pereloginsya, HttpError }
Ayrat
операция возвращает Result { Ok, Pereloginsya, HttpError }
допустим. пока что это просто тип-сумма
Mikhαil
Я здесь вижу дю обычный
Ayrat
3 варианта
Anatoly
ок, согласен
Ayrat
сигнатура неправильная
ага, потому что нет тип параметра
Ayrat
в изначальном задании
Shub
мне уже объяснили, я почти склонен согласиться. вопрос в том, как бы это накодить.
а зачем тебе? у тебя все равно не будет нормального синтаксиса, чтобы записывать монадический код
Ayrat
я даже пюре не смог нормально придумать
Ayrat
потому что из любого типа его не сделаешь
Shub
ага, потому что нет тип параметра
нет, не поэтому. у тебя там значение
Ayrat
только из двух строк
Vasily
@aensidhe , проще список ошибок копить
Anatoly
потому что я либо щас начну эксепшны кидать, либо вот Result сделаю
Ayrat
в случае задания выше - такое пюре не сделаешь
Ayrat
потому что там нет a
Ayrat
оттого и такие сигнатуры интересные
Ayrat
public abstract class Result { public sealed class Ok : Result { public string AccessToken { get; } public string RefreshToken { get; } public Ok(string accessToken, string refreshToken) { AccessToken = accessToken; RefreshToken = refreshToken; } } public sealed class Unauthorized : Result { public static Unauthorized Instance = new Unauthorized(); private Unauthorized() { } } public sealed class HttpError : Result { public int StatusCode { get; } public string Reason { get; } public HttpError(int statusCode, string reason) { StatusCode = statusCode; Reason = reason; } } public static Result Return(string accessToken, string refreshToken) => new Ok(accessToken, refreshToken); public static Result FlatMap(Result x, Func<Ok, Result> f) => x switch { Ok ok => f(ok), HttpError httpError => httpError, Unauthorized unauthorized => unauthorized, _ => throw new ArgumentOutOfRangeException(nameof(x)) }; }
Ayrat
public static class ResultExtensions { public static Result FlatMap(this Result x, Func<Result.Ok, Result> f) => Result.FlatMap(x, f); }
Ayrat
всё, впродакшн
Ayrat
Mikhαil
Похоже я совсем дурак
Ayrat
В шарпе разве так можно
что именно? это всё валидный код
Mikhαil
Чайлд класс реализующий родительский абстрактный
Mikhαil
Я дебил
Mikhαil
Всем спасибо
Ayrat
вот объявить родителя силедом нельзя
Ayrat
а зря
Ayrat
было бы охуенно
Vladislav
Я дебил
+ дурак?
Mikhαil
+ дурак?
Плюс дурак
Mikhαil
Хотя в целом мне это не очень помогло бы
Mikhαil
Так что чо я расстраиваюсь
Ilya
вот объявить родителя силедом нельзя
О, это ж как в котлине, вроде бы.
Shub
расскажи, зачем мне FlatMap
в некоторых языках наличие bind\flatMap позволяет использовать тот или иной синтаксический сахар, ну типа, чтобы код выглядел императивно. поэтому непонятно, зачем тебе в императивном коде новый императивный синтаксис
Vladislav
Хотя в целом мне это не очень помогло бы
ну зато можно красиво писать Result.Ok(pomogite)
Vladislav
конструкторы
Mikhαil
ну зато можно красиво писать Result.Ok(pomogite)
У меня там через имплисит. Но у меня сам резалт иначе сделан и он про бизнес ошибки. В целом получилось норм, хотя имплисит немного пугает. Но читаются команды и квери симпатично
Anatoly
до бизнес-ошибок далеко, я пока пишу обёртку над HttpClient
Vasily
до бизнес-ошибок далеко, я пока пишу обёртку над HttpClient
Да вы, батенька, гуру велосипедостроения
Vasily
Карочи
Anatoly
Да вы, батенька, гуру велосипедостроения
у меня есть 5 нестандартных oauth апишек, выдающих acces/refresh токены
Vasily
Как бы я сделал
Anatoly
я тут пишу 6й стандарт, как ты понимаешь
Vasily
вот прям чтобы работало
Vasily
Код ошибки
Vasily
И текст
Vasily
Все
Vasily
Дальше изи
Фил Ранжин
я тут по динамщикам проехался
Mikhαil
имплисит?
Ну у тебя ответы команд и квери типа result<t> И ты либо возвращаешь в команде t либо ошибку из du ошибок а он через имплисит приведения в резалт сам оборачивает. Могу в лс потом кинуть
Фил Ранжин
Фил Ранжин
прям не заебывался, просто прям в статье поназывал всех болванами и говнарями
Фил Ранжин
и работает
Anatoly
public abstract class Result { public sealed class Ok : Result { public string AccessToken { get; } public string RefreshToken { get; } public Ok(string accessToken, string refreshToken) { AccessToken = accessToken; RefreshToken = refreshToken; } } public sealed class Unauthorized : Result { public static Unauthorized Instance = new Unauthorized(); private Unauthorized() { } } public sealed class HttpError : Result { public int StatusCode { get; } public string Reason { get; } public HttpError(int statusCode, string reason) { StatusCode = statusCode; Reason = reason; } } public static Result Return(string accessToken, string refreshToken) => new Ok(accessToken, refreshToken); public static Result FlatMap(Result x, Func<Ok, Result> f) => x switch { Ok ok => f(ok), HttpError httpError => httpError, Unauthorized unauthorized => unauthorized, _ => throw new ArgumentOutOfRangeException(nameof(x)) }; }
public abstract class RefreshTokenResult { private static object Dummy = new object(); protected RefreshTokenResult() => throw new InvalidOperationException(); private RefreshTokenResult(object _) { } public sealed class Ok : RefreshTokenResult { public string AccessToken { get; } public string RefreshToken { get; } public Ok(string accessToken, string refreshToken) : base(Dummy) { AccessToken = accessToken; RefreshToken = refreshToken; } } public sealed class HttpError : RefreshTokenResult { public HttpStatusCode Code { get; } public string Reason { get; } public HttpError(HttpStatusCode code, string reason) : base(Dummy) { Code = code; Reason = reason; } } }
Anatoly
гляди, теперь абстрактный класс тоже "sealed" 😃
Mikhαil
Ахахахаха
Ayrat
а, ну да.
Ayrat
-_-
Ayrat
хороший костыль, годный
Anatoly
и вообще, я тут подумал, что именно так я могу и принести эфшарпы в контору
Anatoly
покажу, что код чище, лучше и понятнее.
Anatoly
и потом такой: "а вот на эфшарпе в 20 раз короче"