Skip to content

File i_sanity_checker.h

File List > core > i_sanity_checker.h

Go to the documentation of this file

#pragma once
#include <uipc/common/type_define.h>
#include <uipc/common/dllexport.h>
#include <uipc/common/span.h>
#include <uipc/common/smart_pointer.h>
#include <uipc/common/unordered_map.h>
#include <uipc/geometry/geometry.h>

namespace uipc::backend
{
class SanityCheckMessageVisitor;
}

namespace uipc::core
{
class Scene;

enum class SanityCheckResult : int
{
    Success = 0,
    Warning = 1,
    Error   = 2
};

class UIPC_CORE_API SanityCheckMessage
{
  public:
    SanityCheckMessage() = default;

    U64               id() const noexcept;
    std::string_view  name() const noexcept;
    SanityCheckResult result() const noexcept;
    std::string_view  message() const noexcept;
    const unordered_map<std::string, S<geometry::Geometry>>& geometries() const noexcept;
    bool is_empty() const noexcept;

  private:
    friend class backend::SanityCheckMessageVisitor;
    U64               m_id = 0;
    std::string       m_name;
    SanityCheckResult m_result = SanityCheckResult::Success;
    std::string       m_message;
    unordered_map<std::string, S<geometry::Geometry>> m_geometries;
};

class UIPC_CORE_API SanityCheckMessageCollection
{
  public:
    SanityCheckMessageCollection() = default;
    const auto& messages() const noexcept { return m_messages; }
    auto&       messages() noexcept { return m_messages; }

  private:
    unordered_map<U64, S<SanityCheckMessage>> m_messages;
};

class UIPC_CORE_API ISanityChecker
{
  public:
    virtual ~ISanityChecker() = default;
    virtual void      build();
    U64               id() const noexcept;
    SanityCheckResult check(SanityCheckMessage& msg);
    std::string       name() const noexcept;

  protected:
    virtual U64               get_id() const noexcept           = 0;
    virtual std::string       get_name() const noexcept         = 0;
    virtual SanityCheckResult do_check(SanityCheckMessage& msg) = 0;
};

class UIPC_CORE_API SanityCheckerCollectionCreateInfo
{
  public:
    std::string_view workspace;
};

class UIPC_CORE_API ISanityCheckerCollection
{
  public:
    virtual ~ISanityCheckerCollection() = default;
    virtual void build(Scene& s)        = 0;
    virtual SanityCheckResult check(SanityCheckMessageCollection& msg) const = 0;
};
}  // namespace uipc::core