如何检测Scala中某个库的导入

时间:2014-12-01 12:09:36

标签: scala reflection

我非常确定可以使用反射API来完成。

我同时使用Casbahspray.json在Scala项目中创建JSON文档 - 一个面向MongoDB,另一个面向REST API。

这有时令人困惑。我想检测并禁止import错误的"某个源文件中的库,确保将来的编辑永远不会在同一代码中混合使用这两种方法。

可能没有编译时机制来执行此操作(宏除外,不想这么深)。

运行时方法(例如放置在object体内以使其在前面运行)会没问题。即如何在Scala中将spray.json命名空间导入此范围?


早期问题:Prevent imports of unauthorized classes in Scala触及关闭,但更多关于沙盒(不可信代码)

1 个答案:

答案 0 :(得分:1)

在澄清你的评论之后,我要做的是根据哪些类型是“安全的”来结束Casbah序列化。有一个“网关”方法可以进行Casbah序列化,还有一个标记界面可以说明哪些类型“安全”发送到Casbah

trait CasbahSafe[T]

object CasbahSafe {
  implicit val intsAreSafe = new CasbahSafe[Int]{}
  implicit val stringsAreSafe = new CasbahSafe[String]{}
  ...
}

def saveToMongo[T: CasbahSafe](t: T) = ...

然后只能使用适当的类型调用saveToMongo;如果您尝试使用JsNumber调用它,则会出现编译错误。对于复合类型,您可以使用Shapeless automatic typeclass derivation为所有字段为CasbahSafe的任何案例类派生CasbahSafe

整体效果与spray-json对JsonFormat的效果非常相似。应该已经不可能“在相反的方向犯同样的错误”,因为编译器强制存在JsonFormat