/*
 * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
 * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
 *
 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
 *
*/
#pragma once

#include <boost/optional.hpp>
#include <boost/variant.hpp>

struct enum_ {
    enum_();
    enum_(const std::string& value);
    bool operator==(const enum_& b) const;
    bool operator<(const enum_& b) const;
    std::string m_value;
};

struct binary_ {
    binary_();
    binary_(const std::string& value);
    bool operator==(const binary_& b) const;
    bool operator<(const binary_& b) const;
    std::string m_value;
};

struct empty_ {
    empty_();
    bool operator==(const empty_) const;
    bool operator<(const empty_) const;
};

struct module_ {
    bool operator==(const module_& b) const;
    bool operator<(const module_& b) const;
    std::string m_name;
};

struct identityRef_ {
    identityRef_();
    identityRef_(const std::string& module, const std::string& value);
    identityRef_(const std::string& value);
    bool operator==(const identityRef_& b) const;
    bool operator<(const identityRef_& b) const;
    boost::optional<module_> m_prefix;
    std::string m_value;
};

enum class SpecialValue {
    List,
    Container,
    PresenceContainer
};

struct special_ {
    bool operator==(const special_& b) const;
    bool operator<(const special_& b) const;
    SpecialValue m_value;
};

enum class Datastore {
    Running,
    Startup
};

std::string specialValueToString(const special_& value);

using leaf_data_ = boost::variant<enum_,
                                  binary_,
                                  empty_,
                                  identityRef_,
                                  special_,
                                  double,
                                  bool,
                                  int8_t,
                                  uint8_t,
                                  int16_t,
                                  uint16_t,
                                  int32_t,
                                  uint32_t,
                                  int64_t,
                                  uint64_t,
                                  std::string>;
