// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #pragma once #include "ServiceManifest.hpp" #include namespace sys { class Service; class BaseServiceCreator { public: explicit BaseServiceCreator(ServiceManifest &&manifest) noexcept : manifest{std::move(manifest)} {} virtual ~BaseServiceCreator() noexcept = default; [[nodiscard]] virtual std::shared_ptr create() const = 0; [[nodiscard]] auto getName() const noexcept -> const ServiceManifest::ServiceName & { return manifest.name; } [[nodiscard]] auto getDependencies() const noexcept -> const std::vector & { return manifest.dependencies; } [[nodiscard]] auto getStartTimeout() const noexcept -> ServiceManifest::Timeout { return manifest.timeout; } private: ServiceManifest manifest; }; template class ServiceCreator : public BaseServiceCreator { public: using BaseServiceCreator::BaseServiceCreator; [[nodiscard]] auto create() const -> std::shared_ptr override { return std::make_shared(); } }; template std::unique_ptr CreatorFor() noexcept { return std::make_unique>(ManifestOf()); } } // namespace sys