Проверка общего поля с помощью признаков в Lift
Я пытаюсь определить trait Required
инкапсулировать логику для проверки наличия необходимого Record
Field
Однако я не смог понять, каким должен быть тип личности. Моя цель - написать что-то как можно ближе к object foo extends SomeField(...) with Required
Однако я понимаю, что мне, возможно, придется явно передать некоторые параметры типа Required
,
Мой некомпетентный вывод до сих пор был:
import net.liftweb.record.Field import net.liftweb.util.FieldError
trait Required[ThisType, OwnerType] {
this: Field[ThisType, OwnerType] =>
def errMsg = "is required"
override def validations = {
val required =
(x: String) => if (x.isEmpty) List(FieldError(this, errMsg)) else Nil
// this asInstanceOf call also seems fishy
// --why's it even required if we already have the self type in place?
required :: super.asInstanceOf[Field[ThisType, OwnerType]].validations
}
}
однако это приводит к ошибкам компиляции и предупреждениям, связанным с экзистенциальными типами из:
myfield = object SomeField(...) with Required[SomeField[SomeModel], SomeModel]
не говоря уже о том, насколько это получается из краткого with Required
,
РЕДАКТИРОВАТЬ:
Я придумал это вместо этого:
trait Required[OwnerType] extends Field[String, OwnerType] {
def errMsg = "is required"
override def validations = {
val required =
(x: String) => if (x.isEmpty) List(FieldError(this, errMsg)) else Nil
required :: super.validations
}
}
однако, это не позволяет мне предварять required
в super.validations
потому что это ожидает this.type.ValueType => List[FieldError]
не String => List[FieldError]
что я нахожу странным, потому что в случае Field[String, ...]
, ValueType
является String
,
Если я изменю required
быть ValueType => ...
компилируется, но with Required[SomeModel]
ошибки с:
аргументы типа [String,OwnerType] не соответствуют границам параметра типа свойства trait [ThisType, OwnerType <: net.liftweb.record.Record [OwnerType]]
...даже если StringField.ThisType
является String
а также String.OwnerType
это подкласс Record[SomeModel]
, SomeModel
будучи подклассом MongoRecord[SomeModel]
, -Я потерялся.
PS Это связано с Lift Record: пустое значение для обязательного поля, но нет ошибок проверки
1 ответ
Следующее компилируется в консоли SBT.
import net.liftweb.util._
import net.liftweb.record._
import net.liftweb.record.field._
trait Required extends StringTypedField {
override def validations: List[ValidationFunction] = valMinLen(1, "Required!") _ :: super.validations
}
class TestRecord extends Record[TestRecord] {
val meta = TestRecord
object testField extends StringField(this, 255) with Required
}
object TestRecord extends TestRecord with MetaRecord[TestRecord]