in nlpcraft/src/main/scala/org/apache/nlpcraft/internal/impl/NCModelScanner.scala [83:154]
def apply(cfg: NCModelConfig, intent: NCIDLIntent, obj: AnyRef, mtd: Method): IntentHolder =
new IntentHolder(intent, prepareCallback(cfg, mtd, obj, intent), mtd)
/**
*
* @param iter
*/
private def col2Str(iter: Iterable[_]): String = iter.mkString("(", ",", ")")
/**
*
* @param clazz
*/
private def class2Str(clazz: Class[_]): String =
val cls = clazz.getSimpleName.strip
// Anonymous classes (like `class foo.bar.name$1`) doesn't have simple names.
if cls.nonEmpty then cls else clazz.getName.reverse.takeWhile(_ != '.').reverse
/**
*
* @param mtd
*/
private def method2Str(mtd: Method): String =
val cls = class2Str(mtd.getDeclaringClass)
val name = mtd.getName
val args = mtd.getParameters.map(_.getType.getSimpleName).mkString(", ")
s"$cls#$name($args)"
/**
*
* @param f
*/
private def field2Str(f: Field): String =
val cls = class2Str(f.getDeclaringClass)
val name = f.getName
s"$cls.$name"
/**
*
* @param cfg
* @param mtd
* @param prmClss
* @param argsList
*/
private def prepareParams(cfg: NCModelConfig, mtd: Method, prmClss: List[Class[_]], argsList: List[List[NCEntity]]): Seq[AnyRef] =
prmClss.zip(argsList).zipWithIndex.map { case ((paramCls, argList), i) =>
def mkArg(): String = arg2Str(mtd, i)
lazy val z = s"mdlId=${cfg.getId}, type=$paramCls, arg=${mkArg()}"
val entsCnt = argList.size
// Single entity.
if paramCls == CLS_ENTITY then
if entsCnt != 1 then E(s"Expected single entity (found $entsCnt) in $IT annotated argument [$z]")
argList.head
// Array of entities.
else if paramCls.isArray then
argList.toArray
else if paramCls == CLS_SCALA_SEQ then
argList
else if paramCls == CLS_SCALA_LST then
argList
else if paramCls == CLS_SCALA_OPT then
entsCnt match
case 0 => None
case 1 => argList.head.?
case _ => E(s"Too many entities ($entsCnt) for 'scala.Option[_]' $IT annotated argument [$z]")
else
// All allowed arguments types already checked.
throw new AssertionError(s"Unexpected type for callback's $IT argument [$z]")
}