build.sc
changeset 21 175e7d7ce5b3
parent 20 529418651908
child 22 35f19c3873e2
--- a/build.sc	Thu Jan 17 14:51:59 2019 +0100
+++ b/build.sc	Thu Jan 17 18:24:38 2019 +0100
@@ -66,6 +66,70 @@
     super.sources() :+ PathRef(millSourcePath / 'shared / 'src / 'main / 'scala)
   }
 
+  // https://github.com/FortAwesome/Font-Awesome/raw/5.6.3/metadata/icons.json
+  type IcoDef = (String, Set[String])
+  def parseIcons: Target[List[IcoDef]] = T{
+    ujson.read(os.read! pwd / "icons.json").obj.map(e => (e._1, e._2.obj("styles").arr.map(_.str).toSet)).toList
+  }
+
+  private def tpl(d: IcoDef): String = {
+    val sym = d._1 match {
+      //case "clone" => "clone_"
+      case x => x
+    }
+    d._2.map {
+      case "brands" => s"""      val `fab-$sym`: T = fab("${d._1}")\n"""
+      case "solid" => s"""      val `fas-$sym`: T = fas("${d._1}")\n"""
+      case "regular" => s"""      val `far-$sym`: T = far("${d._1}")\n"""
+    }.mkString
+  }
+
+  override def generatedSources: Sources = T.sources{
+    val d = T.ctx().dest
+    val icons = parseIcons()
+    write(d / "generated.scala",
+      s"""
+        | package fontawesome.generic
+        | import scalatags.generic._
+        | class GenericFA[Builder, Output <: FragT, FragT](
+        |   val bun: Bundle[Builder, Output, FragT]) {
+        |
+        |   import bun.all._
+        |
+        |   type T = FA[Builder, Output, FragT]
+        |
+        |   val faStack: Modifier = cls := "fa-stack fa-lg"
+        |
+        |   implicit val bundle: Bundle[Builder, Output, FragT] = bun
+        |   implicit def fa2tag(x: T): TypedTag[Builder, Output, FragT] = x()
+        |
+        |   private def fab(w: String): T = FA(FaStyle.Brands, w)
+        |   private def far(w: String): T = FA(FaStyle.Regular, w)
+        |   private def fas(w: String): T = FA(FaStyle.Solid, w)
+        |
+        |   ${icons map(tpl) mkString}
+        |
+        |   /*
+        |   object fab {
+        |     private def fa(w: String): T = FA(FaStyle.Brands, w)
+        |     {icons.filter(_._2.contains("brands")).map(tpl).mkString}
+        |   }
+        |
+        |   object fas {
+        |     private def fa(w: String): T = FA(FaStyle.Solid, w)
+        |     {icons.filter(_._2.contains("solid")).map(tpl).mkString}
+        |   }
+        |
+        |   object far {
+        |     private def fa(w: String): T = FA(FaStyle.Regular, w)
+        |     {icons.filter(_._2.contains("regular")).map(tpl).mkString}
+        |   }
+        |   */
+        |
+        | }
+      """.stripMargin)
+    d
+  }
 }
 
 class JvmModule(val crossScalaVersion: String) extends Common
@@ -85,9 +149,18 @@
 }
 
 object example extends ScalaModule with ScalaJSModule {
-  override def moduleDeps: Seq[PublishModule] = Seq(js(V.scala212))
   override def scalaVersion: Target[String] = T{V.scala212}
   override def scalaJSVersion: Target[String] = V.scalaJs
+
+
+  /* Ugly hack to prevent
+   * "Referring to non-existent method fontawesome.generic.FA... error"
+   */
+  //override def moduleDeps: Seq[PublishModule] = Seq(js(V.scala212))
+  override def ivyDeps: Target[Loose.Agg[Dep]] = Agg(D.scalatags)
+  override def sources: Sources = T.sources{super.sources() ++ js(V.scala212).sources()}
+  override def generatedSources = T{js(V.scala212).generatedSources()}
 }
 
+
 // vim: et ts=2 sw=2 syn=scala