diff --git a/container/src/root/common/utility.hh b/container/src/root/common/utility.hh index 9bb107e..01c5cf9 100644 --- a/container/src/root/common/utility.hh +++ b/container/src/root/common/utility.hh @@ -421,8 +421,52 @@ class PluggablePath //! \since docker-finance 1.1.0 class PluggableSpace { + public: + //! \brief Parses (or re-parses) constructed types + //! \warning Only call this function after constructing if underlying type::PluggableSpace has been changed (post-construction) + //! \return NPI reference + auto& parse() + { + auto const parser = [](const std::string& space) -> std::string { + std::string parsed{space}; + + // NOTE: allowed to be empty (for now) + if (!parsed.empty()) + { + throw_ex_if( + !std::regex_match( + parsed, + std::regex{ + "[a-zA-Z0-9:/_\\-]+"} /* TODO(unassigned): refine */), + "invalid characters in namespace"); + + if (parsed.find('/')) + { + parsed = std::regex_replace(parsed, std::regex{"/"}, "::"); + } + if (parsed.find('-')) + { + parsed = std::regex_replace(parsed, std::regex{"-"}, "_"); + } + } + + return parsed; + }; + + m_space.outer(parser(m_space.outer())); + m_space.inner(parser(m_space.inner())); + + return *this; + } + protected: - explicit PluggableSpace(const type::PluggableSpace& space) : m_space(space) {} + // \note Since the current presumption is that a PluggableSpace is likely + // to be derived from an operating system path (via PluggablePath), + // there's leeway for path-to-namespace conversions to be done here. + explicit PluggableSpace(const type::PluggableSpace& space) : m_space(space) + { + parse(); + } ~PluggableSpace() = default; PluggableSpace(const PluggableSpace&) = default;