rsffish 0.0.20

A Rust wrapper for fairystockfish based on https://github.com/mind-sports-games/Fairy-Stockfish-Lib
Documentation
#include "fairystockfishrs.h"

#include "rsffish/src/lib.rs.h"

#include <algorithm>

namespace rsffish {

    rust::Vec<rust::String> toRust(std::vector<std::string> const &vals) {
        rust::Vec<rust::String> retVal;
        std::copy(vals.begin(), vals.end(), std::back_inserter(retVal));
        return retVal;
    }

    std::vector<std::string> toCpp(rust::Vec<rust::String> const &vals) {
        std::vector<std::string> retVal;
        std::transform(
            vals.begin(),
            vals.end(),
            std::back_inserter(retVal),
            [](auto const &s) {
                return std::string(s);
            }
        );
        return retVal;
    }

    TestWithGameResult toRust(std::tuple<bool, int> res) {
        return rsffish::TestWithGameResult{
            std::get<0>(res),  
            std::uint32_t(std::get<1>(res))
        };
    }
    TestByPlayers toRust(std::tuple<bool, bool> res) {
        return rsffish::TestByPlayers{
            std::get<0>(res),  
            std::get<1>(res)
        };
    }

    void init() { fairystockfish::init(); }

    rust::String version() { return fairystockfish::version(); }

    void info() { fairystockfish::info(); }

    void setUCIOption(rust::String const &name, rust::String const &value) {
        fairystockfish::setUCIOption(std::string(name), std::string(value));
    }

    void loadVariantConfig(rust::String const &config) {
        fairystockfish::loadVariantConfig(std::string(config));
    }

    rust::Vec<rust::String> availableVariants() {
        return toRust(fairystockfish::availableVariants());
    }

    rust::Vec<Piece> toRust(std::vector<fairystockfish::Piece> const &vals) {
        rust::Vec<Piece> retVal;
        std::transform(
            vals.begin(),
            vals.end(),
            std::back_inserter(retVal),
            [](auto const &p) {
                return toRust(p);
            }
        );
        return retVal;
    }

    rsffish::PieceInfo toRust(fairystockfish::PieceInfo const &p) {
        return rsffish::PieceInfo{
            std::uint32_t(p.id()),
            p.name(),
            p.betza()
        };
    }

    rsffish::Piece toRust(fairystockfish::Piece const &p) {
        return rsffish::Piece{
            p.isWhite() ? Color::White : Color::Black,
            p.promoted(),
            toRust(p.pieceInfo())
        };
    }

    rsffish::PieceOnBoard toRust(fairystockfish::Square square, fairystockfish::Piece const &p) {
        return rsffish::PieceOnBoard{
            toRust(p),
            square
        };

    }

    rust::String initialFen(rust::String const &variantName) { return fairystockfish::initialFen(std::string(variantName)); }

    rust::Vec<rsffish::PieceInfo> availablePieces() {
        auto pieceMap = fairystockfish::availablePieces();
        rust::Vec<PieceInfo> retVal;
        for (auto const &[name, piece] : pieceMap) {
            retVal.push_back(toRust(piece));
        }
        return retVal;
    }

    rust::String availablePieceChars() { return fairystockfish::availablePieceChars(); }
    rust::String availablePromotablePieceChars() { return fairystockfish::availablePromotablePieceChars(); }

    bool validateFEN(rust::String const &variantName, rust::String const &fen, bool isChess960) {
        return fairystockfish::validateFEN(std::string(variantName), std::string(fen), isChess960);
    }

    rust::Vec<rust::String> to960Uci(rust::String const &variantName, rust::Vec<rust::String> const &moves) {
        return toRust(fairystockfish::to960Uci(std::string(variantName), toCpp(moves)));
    }

    std::unique_ptr<Position> startingPosition(rust::String const &variantName, bool isChess960) {
        return std::make_unique<Position>(
            fairystockfish::Position{std::string(variantName), isChess960}
        );
    }

    std::unique_ptr<Position> positionFromFen(rust::String const &variantName, rust::String const &fen, bool isChess960) {
        return std::make_unique<Position>(
            fairystockfish::Position{std::string(variantName), std::string(fen), isChess960}
        );
    }

    std::unique_ptr<Position> Position::makeMoves(rust::Vec<rust::String> const &moves) const {
        std::vector<std::string> uciMoves;
        for (auto const &m : moves) {
            uciMoves.push_back(std::string(m));
        }
        return std::make_unique<Position>(impl->makeMoves(uciMoves));
    }

    rust::String Position::getFEN() const { return impl->getFEN(); }
    rust::String Position::getFENWithArgs(bool sFen, bool showPromoted, std::uint32_t countStarted) const {
        return impl->getFEN(sFen, showPromoted, countStarted);
    }
    rust::String Position::getSAN(rust::String const &uci) const { return impl->getSAN(std::string(uci)); }
    rust::String Position::getSANWithNotation(rust::String const &uci, Notation notation) const {
        return impl->getSAN(std::string(uci), notation);
    }

    rust::Vec<rust::String> Position::getSANMoves(rust::Vec<rust::String> const &uci) const {
        return toRust(impl->getSANMoves(toCpp(uci)));
    }
    rust::Vec<rust::String> Position::getSANMovesWithNotation(rust::Vec<rust::String> const &uci, Notation notation) const {
        return toRust(impl->getSANMoves(toCpp(uci), notation));
    }

    rust::Vec<rust::String> Position::getLegalMoves() const {
        return toRust(impl->getLegalMoves());
    }

    rust::Vec<rsffish::Piece> Position::piecesInHand() const {
        return toRust(impl->piecesInHand());
    }
    rust::Vec<rsffish::PieceOnBoard> Position::piecesOnBoard() const {
        auto pieceMap = impl->piecesOnBoard();
        rust::Vec<PieceOnBoard> retVal;
        for (auto const &[square, piece] : pieceMap) {
            retVal.push_back(toRust(square, piece));
        }
        return retVal;
    }

    bool Position::givesCheck() const { return impl->givesCheck(); }
    bool Position::hasRepeated() const { return impl->hasRepeated(); }
    bool Position::isDraw(std::uint32_t ply) const { return impl->isDraw(int(ply)); }
    bool Position::hasGameCycle(std::uint32_t ply) const { return impl->hasGameCycle(int(ply)); }
    std::int32_t Position::gameResult() const {
        return std::int32_t(impl->gameResult());
    }

    rsffish::TestWithGameResult Position::isImmediateGameEnd() const {
        return toRust(impl->isImmediateGameEnd());
    }

    rsffish::TestWithGameResult Position::isOptionalGameEnd() const {
        return toRust(impl->isOptionalGameEnd());
    }
    rsffish::TestByPlayers Position::hasInsufficientMaterial() const {
        return toRust(impl->hasInsufficientMaterial());
    }
}