2016-09-22 10 views
5

Kotlin भयानक type safe builders कि डीएसएल के बनाने के लिए इसस्कटल में काम करने के लिए कोटलिन के प्रकार के सुरक्षित बिल्डरों को कैसे प्राप्त करें?

html { 
    head { 
    title("The title") 
    body {} // compile error 
    } 
    body {} // fine 
} 

त की तरह संभव बनाते हैं कि आप अमान्य स्थानों में टैग नहीं डाल सकते हैं, शरीर की तरह अंदर सिर, स्वत: पूर्ण करने भी ठीक से काम करता है।

मुझे दिलचस्पी है यदि यह स्कैला में हासिल किया जा सकता है। इसे कैसे प्राप्त करें?

उत्तर

1

यदि आप एचटीएमएल बनाने में रुचि रखते हैं, तो एक पुस्तकालय scalatags है जो समान अवधारणा का उपयोग करता है। इस तरह के बिल्डरों को प्राप्त करने के लिए किसी भी विशिष्ट भाषा संरचना की आवश्यकता नहीं है। यहां एक उदाहरण दिया गया है:

object HtmlBuilder extends App { 
    import html._ 
    val result = html { 
     div { 
      div{ 
       a(href = "http://stackoverflow.com") 
      } 
     } 
    } 
} 

sealed trait Node 
case class Element(name: String, attrs: Map[String, String], body: Node) extends Node 
case class Text(content: String) extends Node 
case object Empty extends Node 

object html { 
    implicit val node: Node = Empty 
    def apply(body: Node) = body 
    def a(href: String)(implicit body: Node) = 
     Element("a", Map("href" -> href), body) 
    def div(body: Node) = 
     Element("div", Map.empty, body) 
} 

object Node { 
    implicit def strToText(str: String): Text = Text(str) 
} 
+0

स्केलैटैग प्रकार-सुरक्षा आवश्यकता को पूरा नहीं करता है। – Yaroslav

+0

@ यरोस्लाव ठीक है, आप सही हैं। और यह कम से कम अभी तक इतनी साफ एपीआई बनाने का एक तरीका प्रतीत नहीं होता है। कुछ दिन निहित कार्य प्रकारों के साथ डॉटी होगा http://dotty.epfl.ch/blog/2016/12/05/implicit-function-types.html#how-to-remove-boilerplate। वे वही करेंगे जो आपको चाहिए। –

+0

@ यरोस्लाव वहाँ एक और lib है जिसे rapture https://github.com/propensive/rapture कहा जाता है। और आप टाइप सुरक्षित टेम्पलेट्स को कार्यान्वित कर सकते हैं। दस्तावेज शुद्ध है लेकिन यह काम करता है। वेबसाइट https://github.com/propensive/contextual-web/blob/master/src/main/scala/main.scala का उदाहरण यहां दिया गया है –

संबंधित मुद्दे