Skip to content

Commit

Permalink
Add literal uci
Browse files Browse the repository at this point in the history
  • Loading branch information
lenguyenthanh committed Oct 28, 2024
1 parent f9497ee commit 634af22
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 2 deletions.
13 changes: 12 additions & 1 deletion test-kit/src/main/scala/chess/macros.scala
Original file line number Diff line number Diff line change
@@ -1,16 +1,27 @@
package chess

import cats.syntax.all.*
import org.typelevel.literally.Literally
import chess.format.Uci
import chess.format.pgn.*
import org.typelevel.literally.Literally

object macros:
extension (inline ctx: StringContext)

inline def pgn(inline args: Any*): ParsedPgn =
${ PgnLiteral('ctx, 'args) }

inline def uci(inline args: Any*): Uci =
${ UciLiteral('ctx, 'args) }

object PgnLiteral extends Literally[ParsedPgn]:
def validate(s: String)(using Quotes) =
Parser.full(PgnStr(s)) match
case Right(parsed) => Right('{ Parser.full(PgnStr(${ Expr(s) })).toOption.get })
case Left(err) => Left(err.toString)

object UciLiteral extends Literally[Uci]:
def validate(s: String)(using Quotes) =
Uci(s) match
case Some(_) => Right('{ Uci(${ Expr(s) }).get })
case _ => Left(s"Invalid UCI: $s")
8 changes: 7 additions & 1 deletion test-kit/src/test/scala/format/pgn/MacrosTest.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
package chess

import macros.*

class MacrosTest extends munit.FunSuite:

import macros.*
test("pgn macro"):
val pgn = pgn"1. e4 e5 2. Nf3 Nc6"
assert(pgn.tree.isDefined)
assertEquals(pgn.toPgn.toString, "1. e4 e5 2. Nf3 Nc6")

test("uci macro"):
val uci = uci"d2d4"
assert(uci.isInstanceOf[chess.format.Uci.Move])
assertEquals(uci.uci, "d2d4")

0 comments on commit 634af22

Please sign in to comment.