
Dmitry
22.03.2018
13:51:23
@art4ride Вопрос не в том, что можно сделать в Elixir-е. Вопрос, зачем сделали так в Go???

Vladimir
22.03.2018
13:52:03
видел пару либ для подобного взаимодействия
https://blog.fazibear.me/elixir-ruby-dont-fight-talk-with-erlix-24b0f5ed8d12
https://blog.fazibear.me/elixir-ruby-dont-fight-talk-with-erlectricity-dbf3af67d999

Dmitry
22.03.2018
13:52:12
Хотя я, наверное, оффтопю слишком сильно, спрашивая про Go здесь. Поэтому можно игнорировать мой вопрос.

Vladimir
22.03.2018
13:53:02
На вкус и цвет все фломастеры разные. Создатели Го — приверженцы такого стиля

Google

Alister
22.03.2018
13:54:07

Nikolay
22.03.2018
15:35:23

Артем
22.03.2018
15:49:27
всем бы ишшьюсы покидать, нет бы пр))

Nikolay
22.03.2018
16:05:29
я хз как там сейчас, но когда я 2 года наза эту шляпу прикручивал, то был жетский проёб - при вызове changeset’a, если у тебя данные были не валидные, то эта либа всё равно грузила файл на s3
т.е. вызов changeset’a вызывал нихуйный сайдэффектик

Le
22.03.2018
18:14:06

$ergi0
22.03.2018
21:58:13
А как жить с отсутствием early return? Непрерывно хочется себя убить

Dmitry
22.03.2018
21:59:43
А где отсутствует early return?

$ergi0
22.03.2018
22:01:53
В эликсире

Dmitry
22.03.2018
22:06:38
Я как-то не задумывался
Скажу по секрету, я почти не пользуюсь переменными
Чтобы что-то вернуть, надо чтобы это что-то было
А я не пользуюсь переменными...

Google

Dmitry
22.03.2018
22:11:36
вот например файл 100 строк - ни одной переменной
https://github.com/agalaframework/agala_telegram/blob/master/lib/receiver.ex
И все такие...
Короче, return не нужен

$ergi0
22.03.2018
22:19:59

Dmitry
22.03.2018
22:20:39
Не в ФП

$ergi0
22.03.2018
22:32:40
Пока как-то очень тяжело
На проверку наличия пяти кастомных хедеров в Фениксе ушло два часа :)
Вместо 10 минут в golang

Dmitry
22.03.2018
23:03:39
$ergi0 Можно посмотреть как оное выглядит на Elixir и Golang? Если есть такое сравнение.
$ergi0 Я ради любопытства решил начать простой тестовый проект на Golang....и пока разобрался с GOPATH, какая структура файлов, создал всё....Ушло наверное часа два, вместо пары минут с mix new или с cargo new для Rust-а. Вроде такая простая вещь, как создать проект....А оказывается в мире Go - это ещё та непростая задача

$ergi0
22.03.2018
23:06:28
Я ещё не понял, как выглядит на элексире

Dmitry
22.03.2018
23:07:33
А как выглядит на Go? Может подскажу, как сделать на Elixir-е ?

$ergi0
22.03.2018
23:08:49
В голанге просто пять переменных в которые записались значения из Headers и сравнились с пустой строкой в if
В элексире проблема сразу с get_req_header началась
Например с проверкой возвращаемого значения

Dmitry
22.03.2018
23:09:57
if header1 == "" { return ... }
Вот так 5 раз?
В Go
header2

Google

Dmitry
22.03.2018
23:10:41
Т.е. задача не является ли один из 5 header-ов пустым?

$ergi0
22.03.2018
23:11:22
Или отсутствующим
Не могу сейчас код взять :(
Я фениксе я так понял мне нужен Plug, в котором я получаю хедеры и проверяю их

Dmitry
22.03.2018
23:12:11
В общем, нужно вернуть true, если все 5 header-ов присутствуют и false, если какой из них пустой или пустое значение?

$ergi0
22.03.2018
23:12:38
Сначала на наличие, если какогото нет, или он пустой, возвращаем 401
Если все есть, дальше уже разберёмся

Dmitry
22.03.2018
23:13:22
Это пишется 1 строчкой в эликсире
Не знаю как в go

$ergi0
22.03.2018
23:13:28

Dmitry
22.03.2018
23:14:22
Совет: не используй переменные

$ergi0
22.03.2018
23:16:25
Показывай одну строчку ;)
Я уже придумал как сделать в одну строчку написав три доп функции, но это не одна строчка :))

Aldar
22.03.2018
23:24:22
Паттерн матчинг заюзай

$ergi0
22.03.2018
23:31:01
Ну, не допер как пока.
Пример простой
def call(conn) do
end
Внутри плага, надо вернуть 401 если нет хотя бы одного из пяти хедеров (или он пустой)

Dmitry
22.03.2018
23:32:45
defmodule Plug.HeadersTest do
import Plug.Conn
def init(opts), do: %{}
@headers ["test1", "test2", "test3", "test4", "test5"]
def call(conn, opts) do
case Enum.any?(@headers, &(get_req_header(conn, &1) in [[], [""]])) do
true -> conn |> send_resp(401, "") |> halt()
false -> conn
end
end
end
$ergi0 Примерно вот так.
Возвращает 401 - в случае, если один из 5 header-ов отсутствует, либо пустой.

$ergi0
23.03.2018
00:07:38
Ну вот я примерно в эту сторону начал думать, после того, как по кривому сделал

Google

$ergi0
23.03.2018
00:08:02
Очень много времени на [], [""] ушло
Спасибо, попробую!

Александр
23.03.2018
05:34:51
defmodule Plug.HeadersTest do
import Plug.Conn
def init(opts), do: %{}
@headers ["test1", "test2", "test3", "test4", "test5"]
def call(conn, opts) do
case Enum.any?(@headers, &(get_req_header(conn, &1) in [[], [""]])) do
true -> conn |> send_resp(401, "") |> halt()
false -> conn
end
end
end
https://hexdocs.pm/elixir/Enum.html#all?/2
же надо
это как раз все или ничего

Dmitry
23.03.2018
07:47:48
@zloyrusskiy хоть один (any?) header пустой - или все (all?) - имеют значение. Можно и так и так, только функция будет противоположная. Я сделал по-первому варианту.

$ergi0
23.03.2018
10:39:03
Работает нормально, теперь всё остальное сделать :))
Кто готов помогать от переменных избавляться? :)
нужно сделать следующее, получить из хедеров клиент токен, если клиента нет, вернуть ошибку, если есть, проверить подпись. Дальше получить юзера, если его нет, вернуть ошибку, если есть, проверить подпись
Я не могу вкурить, как от переменных избавиться
Проверка юзера будет лезть в базу и не хочется ее делать заранее
Получилось пока так

Никита
23.03.2018
16:31:36
ну в чем сложности. 3 плага, в каждом из них по 5 функций. И где-то около 50 тестов на это надо написать.

$ergi0
23.03.2018
16:31:57
https://pastebin.com/sLfqUzhY

Dmitry
23.03.2018
16:33:17
Ты пробовал пользоваться Guardian?

$ergi0
23.03.2018
16:33:54
Так в них нельзя вызывать внешние функции
Или как именно пользоваться?

Никита
23.03.2018
16:34:11
за гардиан плюсую. и разнести по плагам можно
зачем все проверки в одном плаге?

Google

Dmitry
23.03.2018
16:34:22
Не, тебе короче надо почитать книжки по эликсиру

Никита
23.03.2018
16:34:26
лучше 3 маленьких - каждый из которых сделает свое дело

Dmitry
23.03.2018
16:34:37
Тогда ты будешь знать чем отличается guards от Guardian
Ну и заодно научишься прогать без переменных
https://hex.pm/packages/guardian

$ergi0
23.03.2018
16:36:57
Ага, про гардианы уже нашел, спасибо

Taras ?
23.03.2018
16:40:24
все-равно полностью без переменных не получится)
в том числе и отладка

Dmitry
23.03.2018
16:41:38
Потому что нету присвоения
Есть матчинг

$ergi0
23.03.2018
16:42:09
Хорошо, мой пример можно переделать без присвоения?
Про несколько гардов понял, переделаю

Taras ?
23.03.2018
16:42:37

Dmitry
23.03.2018
16:43:00
Твой пример решается строчкой {:guardian, version} в mix.exs

Никита
23.03.2018
16:44:44
Не, ну если хочется все самому
то сделай 3 плага. Один тебе выше показывали - он проверяет все заголовки