#pragma once
#include "rust/cxx.h"
#include "fairystockfish.h"
#include <memory>
namespace rsffish {
using Notation = fairystockfish::Notation;
using Square = fairystockfish::Square;
struct PieceInfo;
struct TestWithGameResult;
struct TestByPlayers;
struct Piece;
struct PieceOnBoard;
struct Position {
std::unique_ptr<fairystockfish::Position> impl;
Position(std::unique_ptr<fairystockfish::Position> &&p)
: impl{std::move(p)} {}
Position(fairystockfish::Position const &p)
: impl{new fairystockfish::Position(p)} {}
std::unique_ptr<Position> makeMoves(rust::Vec<rust::String> const &moves) const;
rust::String getFEN() const;
rust::String getFENWithArgs(bool sFen, bool showPromoted, std::uint32_t countStarted) const;
rust::String getSAN(rust::String const &uci) const;
rust::String getSANWithNotation(rust::String const &uci, Notation notation) const;
rust::Vec<rust::String> getSANMoves(rust::Vec<rust::String> const &uci) const;
rust::Vec<rust::String> getSANMovesWithNotation(rust::Vec<rust::String> const &uci, Notation notation) const;
rust::Vec<rust::String> getLegalMoves() const;
rust::Vec<rsffish::Piece> piecesInHand() const;
rust::Vec<rsffish::PieceOnBoard> piecesOnBoard() const;
bool givesCheck() const;
bool hasRepeated() const;
bool isDraw(std::uint32_t ply) const;
bool hasGameCycle(std::uint32_t ply) const;
std::int32_t gameResult() const;
rsffish::TestWithGameResult isImmediateGameEnd() const;
rsffish::TestWithGameResult isOptionalGameEnd() const;
rsffish::TestByPlayers hasInsufficientMaterial() const;
};
std::vector<std::string> toCpp(rust::Vec<rust::String> const &vals);
rust::Vec<rust::String> toRust(std::vector<std::string> const &vals);
rust::Vec<Piece> toRust(std::vector<fairystockfish::Piece> const &vals);
TestWithGameResult toRust(std::tuple<bool, int> res);
rsffish::PieceInfo toRust(fairystockfish::PieceInfo const &p);
rsffish::Piece toRust(fairystockfish::Piece const &p);
rsffish::PieceOnBoard toRust(std::string square, fairystockfish::Piece const &p);
void init();
rust::String version();
void info();
void setUCIOption(rust::String const &name, rust::String const &value);
void loadVariantConfig(rust::String const &config);
rust::Vec<rust::String> availableVariants();
rust::String initialFen(rust::String const &variantName);
rust::Vec<rsffish::PieceInfo> availablePieces();
rust::String availablePieceChars();
rust::String availablePromotablePieceChars();
bool validateFEN(rust::String const &variantName, rust::String const &fen, bool isChess960);
rust::Vec<rust::String> to960Uci(rust::String const &variantName, rust::Vec<rust::String> const &moves);
std::unique_ptr<Position> startingPosition(rust::String const &variantName, bool isChess960);
std::unique_ptr<Position> positionFromFen(rust::String const &variantName, rust::String const &fen, bool isChess960);
}