Skip to content

Commit

Permalink
Merge pull request #591 from lenguyenthanh/literal-uci
Browse files Browse the repository at this point in the history
Implement literal uci
  • Loading branch information
lenguyenthanh authored Oct 28, 2024
2 parents 99e0243 + a0cdf79 commit 8211ac7
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,27 @@
package chess
package format.pgn

import cats.syntax.all.*
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")
3 changes: 2 additions & 1 deletion test-kit/src/test/scala/ReplayTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import chess.format.pgn.{ Fixtures, SanStr }
import chess.variant.Chess960

import format.{ FullFen, Fen, Uci }
import macros.uci

class ReplayTest extends ChessTest:

Expand All @@ -27,7 +28,7 @@ class ReplayTest extends ChessTest:
test("bongcloud attack"):
Replay
.situationsFromUci(
moves = List(Uci("e2e4"), Uci("e7e5"), Uci("e1e2")).flatten,
moves = List(uci"e2e4", uci"e7e5", uci"e1e2"),
initialFen = None,
variant = variant.Standard
)
Expand Down
9 changes: 7 additions & 2 deletions test-kit/src/test/scala/format/pgn/MacrosTest.scala
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package chess
package format.pgn

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 8211ac7

Please sign in to comment.