Skip to content

Commit

Permalink
Merge pull request #34 from nguyenyou/feat/implicit-macro
Browse files Browse the repository at this point in the history
implicit macro
  • Loading branch information
nguyenyou authored May 27, 2024
2 parents f19a206 + db4f771 commit e271a8d
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 20 deletions.
5 changes: 5 additions & 0 deletions .changeset/green-flies-joke.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"scalawind": minor
---

implicit macro
43 changes: 23 additions & 20 deletions packages/scalawind/src/templates/scalawind.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ object clx {
{{/each}}
}

case class SwStyle(style: String = "") {
def addClasses(classNames: String): SwStyle = {
case class TwStyle(style: String = "") {
def addClasses(classNames: String): TwStyle = {
val newStyle = s"$style ${classNames}".trim
SwStyle(newStyle)
TwStyle(newStyle)
}
def addClass(className: String): SwStyle = addClasses(className)
def addClass(className: String): TwStyle = addClasses(className)

{{#each modifiers}}
def {{this}}(styles: SwStyle): SwStyle = {
def {{this}}(styles: TwStyle): TwStyle = {
val classes = styles.style.split("\\s+").map(clx => s"{{this}}:$clx").mkString(" ")
addClasses(classes)
}
Expand All @@ -25,30 +25,28 @@ case class SwStyle(style: String = "") {
override def toString: String = style
}

given Conversion[SwStyle, String] with
def apply(swStyle: SwStyle): String = swStyle.style

extension (swStyle: SwStyle)
{{#each standard}}
def {{this.prop}}: SwStyle = swStyle.addClass(clx.{{this.prop}})
{{/each}}

object tw {
def apply(): SwStyle = SwStyle()

{{#each standard}}
def {{this.prop}}: SwStyle = SwStyle().addClass(clx.{{this.prop}})
def {{this.prop}}: TwStyle = TwStyle().addClass(clx.{{this.prop}})
{{/each}}

{{#each modifiers}}
def {{this}}(styles: SwStyle): SwStyle = SwStyle().{{this}}(styles)
def {{this}}(styles: TwStyle): TwStyle = TwStyle().{{this}}(styles)
{{/each}}
}

inline def sw(inline styles: SwStyle): String =
${ swImpl('styles) }
extension (twStyle: TwStyle)
{{#each standard}}
def {{this.prop}}: TwStyle = twStyle.addClass(clx.{{this.prop}})
{{/each}}

inline implicit def sw(inline twStyle: TwStyle): String =
${ swImpl('twStyle) }

private def swImpl(stylesExpr: Expr[SwStyle])(using Quotes): Expr[String] = {

def swImpl(twStyleExpr: Expr[TwStyle])(using Quotes): Expr[String] = {
import quotes.reflect.*

def extractClassNames(term: Term): List[String] = term match {
Expand All @@ -57,21 +55,26 @@ private def swImpl(stylesExpr: Expr[SwStyle])(using Quotes): Expr[String] = {
val classes = extractClassNames(styles).map(clx => s"{{this}}:$clx")
extractClassNames(inner) ++ classes
{{/each}}
case Apply(Select(inner, "md"), List(mdStyle)) =>
val mdClasses = extractClassNames(mdStyle).map(cls => s"md:$cls")
extractClassNames(inner) ++ mdClasses
case Apply(Ident(name), List(inner)) =>
extractClassNames(inner) :+ name.replace("_", "-")
case Inlined(_, _, inner) =>
extractClassNames(inner)
case Select(inner, name) =>
extractClassNames(inner) :+ name.replace("_", "-")
case Ident("twStyle") =>
Nil
case Ident("tw") =>
Nil
case _ =>
report.errorAndAbort(s"Unexpected term: $term")
}

val term = stylesExpr.asTerm
val term = twStyleExpr.asTerm
val classNames = extractClassNames(term)
val combinedClasses = classNames.mkString(" ")
report.info(s"Compiled: $combinedClasses")
report.info(s"Compiled classes: $combinedClasses")
Expr(combinedClasses)
}

0 comments on commit e271a8d

Please sign in to comment.