Перейти к основанию для решения.
Expression[T]
является псевдонимом для Session => Validation[T]
. В простом Engli sh это функция, которая создает полезную нагрузку из сеанса с возможностью сбоя.
Можно считать, что Expression[T]
, абстрактно, «содержит» a T
.
Как, например, Promise
в JavaScript «содержит» будущее значение. Вы не можете присвоить Promise
из T
функции, которая ожидает T
. Если кто-то хочет преобразовать или объединить Promise
s, этот код нужно вывернуть наизнанку и предоставить в качестве аргумента .then
. 1
aPromise + 1 // wrong
aPromise.then(a => a + 1)
Это та же причина, по которой ваш пример кода не компилируется.
Пользователи Gatling не обязательно знакомы с Scala или с функциональным программированием в целом. Это будет контрпродуктивно, чтобы заставить их понять этот «оберточный» материал. 2 Так что есть код, который поможет вам объединить Expression
s.
Для HTTP и других нетипизированных вещей, EL string анализируется и преобразуется в Expression
под капотом.
Сообщения Protobuf строго типизированы, полезная нагрузка не может быть легко построена с использованием строковой интерполяции. Таким образом, операторы :~
на линзах используются для обработки сантехники, поэтому вам не нужно вручную обрабатывать Expression
упаковку.
Но теперь у вас есть функция RequestContext.of
, которая строит полезную нагрузку. Объектив magi c не может помочь, если вам нужна эта функция. Вы должны написать Expression
лямбду самостоятельно. 3
.payload { session =>
for {
guestId <- session("guestId").validate[String]
category <- session("category").validate[String]
} yield RequestContext.of(
Map("test" -> "test"),
Seq(
ContextKey(id = guestID, `type` = Type.GUEST),
ContextKey(id = category, `type` = Type.CATEGORY)
),
Seq()
)
}
Излишне говорить, что это очень громоздко, и люди теперь используют асин c -wait с Promise
s.
An Expression
- это просто монада Either
и монада Reader
, собранные вместе, в чем проблема?
Я могу написать версию с линзами, если я знаю, что делает RequestContext.of
.