--- /dev/null
+//
+// FRMetadata.swift
+// FolioReaderKit
+//
+// Created by Heberti Almeida on 04/05/15.
+// Copyright (c) 2015 Folio Reader. All rights reserved.
+//
+
+import UIKit
+
+/**
+ Represents one of the authors of the book.
+ */
+struct Author {
+ var name: String
+ var role: String
+ var fileAs: String
+
+ init(name: String, role: String, fileAs: String) {
+ self.name = name
+ self.role = role
+ self.fileAs = fileAs
+ }
+}
+
+/**
+ A Book's identifier.
+ */
+struct Identifier {
+ var id: String?
+ var scheme: String?
+ var value: String?
+
+ init(id: String?, scheme: String?, value: String?) {
+ self.id = id
+ self.scheme = scheme
+ self.value = value
+ }
+}
+
+/**
+ A date and his event.
+ */
+struct EventDate {
+ var date: String
+ var event: String?
+
+ init(date: String, event: String?) {
+ self.date = date
+ self.event = event
+ }
+}
+
+/**
+ A metadata tag data.
+ */
+struct Meta {
+ var name: String?
+ var content: String?
+ var id: String?
+ var property: String?
+ var value: String?
+ var refines: String?
+
+ init(name: String? = nil, content: String? = nil, id: String? = nil, property: String? = nil,
+ value: String? = nil, refines: String? = nil) {
+ self.name = name
+ self.content = content
+ self.id = id
+ self.property = property
+ self.value = value
+ self.property = property
+ self.value = value
+ self.refines = refines
+ }
+}
+
+/**
+ Manages book metadata.
+ */
+class FRMetadata {
+ var creators = [Author]()
+ var contributors = [Author]()
+ var dates = [EventDate]()
+ var language = "en-US"
+ var titles = [String]()
+ var identifiers = [Identifier]()
+ var subjects = [String]()
+ var descriptions = [String]()
+ var publishers = [String]()
+ var format = MediaType.epub.name
+ var rights = [String]()
+ var metaAttributes = [Meta]()
+
+ /**
+ Find a book unique identifier by ID
+
+ - parameter id: The ID
+ - returns: The unique identifier of a book
+ */
+ func find(identifierById id: String) -> Identifier? {
+ return identifiers.filter({ $0.id == id }).first
+ }
+
+ func find(byName name: String) -> Meta? {
+ return metaAttributes.filter({ $0.name == name }).first
+ }
+
+ func find(byProperty property: String, refinedBy: String? = nil) -> Meta? {
+ return metaAttributes.filter {
+ if let refinedBy = refinedBy {
+ return $0.property == property && $0.refines == refinedBy
+ }
+ return $0.property == property
+ }.first
+ }
+}