/*
 * Copyright (C) 2020 CESNET, https://photonics.cesnet.cz/
 *
 * Written by Václav Kubernát <kubernat@cesnet.cz>
 *
*/

#pragma once
#include <boost/spirit/home/x3.hpp>
#include "ast_handlers.hpp"
x3::rule<module_identifier_class, std::string> const module_identifier = "module_identifier";
x3::rule<module_class, module_> const module = "module";
x3::rule<node_identifier_class, std::string> const node_identifier = "node_identifier";
x3::rule<space_separator_class, x3::unused_type> const space_separator = "a space";
x3::rule<completing_class, x3::unused_type> const completing = "completing";

// This is a pseudo-parser, that fails if we're not completing a command
auto const completing_def =
    x3::no_skip[x3::eps];

auto const node_identifier_def =
    x3::lexeme[
            ((x3::alpha | x3::char_("_")) >> *(x3::alnum | x3::char_("_") | x3::char_("-") | x3::char_(".")))
    ];

auto const module_def =
    module_identifier >> x3::no_skip[':'] >> !x3::no_skip[x3::space];

auto const module_identifier_def =
    x3::lexeme[
            ((x3::alpha | x3::char_("_")) >> *(x3::alnum | x3::char_("_") | x3::char_("-") | x3::char_(".")))
    ];

auto const space_separator_def =
    x3::omit[x3::no_skip[x3::space]];

template <typename CoerceTo>
struct as_type {
    template <typename...> struct Tag{};

    template <typename ParserType>
    auto operator[](ParserType p) const {
        return x3::rule<Tag<CoerceTo, ParserType>, CoerceTo> {"as"} = x3::as_parser(p);
    }
};

// The `as` parser creates an ad-hoc x3::rule with the attribute specified with `CoerceTo`.
// Example usage: as<std::string>[someParser]
// someParser will have its attribute coerced to std::string
// https://github.com/boostorg/spirit/issues/530#issuecomment-584836532
template <typename CoerceTo> const as_type<CoerceTo> as{};

BOOST_SPIRIT_DEFINE(node_identifier)
BOOST_SPIRIT_DEFINE(module)
BOOST_SPIRIT_DEFINE(module_identifier)
BOOST_SPIRIT_DEFINE(space_separator)
BOOST_SPIRIT_DEFINE(completing)
