summaryrefslogtreecommitdiff
path: root/src/core/resource
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/resource')
-rw-r--r--src/core/resource/Resource.cpp54
-rw-r--r--src/core/resource/Resource.hpp28
2 files changed, 82 insertions, 0 deletions
diff --git a/src/core/resource/Resource.cpp b/src/core/resource/Resource.cpp
index 349c82a..ff3c77f 100644
--- a/src/core/resource/Resource.cpp
+++ b/src/core/resource/Resource.cpp
@@ -16,11 +16,39 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <core/common/Utils.hpp>
+
#include "Resource.hpp"
#include "ResourceLocator.hpp"
namespace ousia {
+/* Helper functions for the internal maps */
+
+static std::unordered_map<ResourceType, std::string, Utils::EnumHash> reverseMap(
+ const std::unordered_map<std::string, ResourceType> &m)
+{
+ std::unordered_map<ResourceType, std::string, Utils::EnumHash> res;
+ for (auto e : m) {
+ res.emplace(e.second, e.first);
+ }
+ return res;
+}
+
+/* Internal maps */
+
+static const std::unordered_map<std::string, ResourceType>
+ NAME_RESOURCE_TYPE_MAP{{"document", ResourceType::DOCUMENT},
+ {"domain", ResourceType::DOMAIN_DESC},
+ {"typesystem", ResourceType::TYPESYSTEM},
+ {"attributes", ResourceType::ATTRIBUTES},
+ {"stylesheet", ResourceType::STYLESHEET},
+ {"script", ResourceType::SCRIPT},
+ {"data", ResourceType::DATA}};
+
+static const std::unordered_map<ResourceType, std::string, Utils::EnumHash>
+ RESOURCE_TYPE_NAME_MAP = reverseMap(NAME_RESOURCE_TYPE_MAP);
+
/* Class Resource */
Resource::Resource()
@@ -39,6 +67,32 @@ std::unique_ptr<std::istream> Resource::stream() const
return locator->stream(location);
}
+std::string Resource::getResourceTypeName(ResourceType resourceType)
+{
+ auto it = RESOURCE_TYPE_NAME_MAP.find(resourceType);
+ if (it != RESOURCE_TYPE_NAME_MAP.end()) {
+ return it->second;
+ }
+ return "unknown";
+}
+
+ResourceType Resource::getResourceTypeByName(const std::string &name)
+{
+ std::string normName = Utils::toLower(name);
+ auto it = NAME_RESOURCE_TYPE_MAP.find(normName);
+ if (it != NAME_RESOURCE_TYPE_MAP.end()) {
+ return it->second;
+ }
+ return ResourceType::UNKNOWN;
+}
+
+/* Operators */
+
+std::ostream &operator<<(std::ostream &os, ResourceType resourceType)
+{
+ return os << Resource::getResourceTypeName(resourceType);
+}
+
/* NullResource instance */
const Resource NullResource{};
diff --git a/src/core/resource/Resource.hpp b/src/core/resource/Resource.hpp
index 1934029..63ed591 100644
--- a/src/core/resource/Resource.hpp
+++ b/src/core/resource/Resource.hpp
@@ -30,6 +30,7 @@
#include <map>
#include <memory>
+#include <ostream>
#include <string>
namespace ousia {
@@ -169,9 +170,36 @@ public:
* a resource.
*/
const std::string &getLocation() const { return location; }
+
+ /**
+ * Returns the name of the given resource type.
+ *
+ * @param resourceType is the ResourceType of which the human readable name
+ * should be returned.
+ * @return the human readable name of the ResourceType.
+ */
+ static std::string getResourceTypeName(ResourceType resourceType);
+
+ /**
+ * Returns a resourceType by its name or ResourceType::UNKNOWN if the name
+ * is invalid.
+ *
+ * @param name is the name of the resource type. The name is converted to
+ * lowercase.
+ */
+ static ResourceType getResourceTypeByName(const std::string &name);
};
/**
+ * Operator used for streaming the name of ResourceType instances.
+ *
+ * @param os is the output stream.
+ * @param resourceType is the type that should be serialized.
+ * @return the output stream.
+ */
+std::ostream& operator<<(std::ostream &os, ResourceType resourceType);
+
+/**
* Invalid resource instance.
*/
extern const Resource NullResource;