Проверка общего поля с помощью признаков в Lift

Я пытаюсь определить trait Required инкапсулировать логику для проверки наличия необходимого RecordFieldОднако я не смог понять, каким должен быть тип личности. Моя цель - написать что-то как можно ближе к 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]
Другие вопросы по тегам