///
/// PublicationMetadata.swift
/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
/// https://github.com/mrousavy/nitro
/// Copyright © Marc Rousavy @ Margelo
///

import NitroModules

/**
 * Represents an instance of `PublicationMetadata`, backed by a C++ struct.
 */
public typealias PublicationMetadata = margelo.nitro.readium.PublicationMetadata

public extension PublicationMetadata {
  private typealias bridge = margelo.nitro.readium.bridge.swift

  /**
   * Create a new instance of `PublicationMetadata`.
   */
  init(title: String, sortAs: String?, subtitle: String?, identifier: String?, accessibility: Accessibility?, modified: String?, published: String?, language: [String]?, author: [Contributor]?, translator: [Contributor]?, editor: [Contributor]?, artist: [Contributor]?, illustrator: [Contributor]?, letterer: [Contributor]?, penciler: [Contributor]?, colorist: [Contributor]?, inker: [Contributor]?, narrator: [Contributor]?, contributor: [Contributor]?, publisher: [Contributor]?, imprint: [Contributor]?, subject: [Subject]?, layout: String?, readingProgression: String?, description: String?, duration: Double?, numberOfPages: Double?, belongsTo: BelongsTo?) {
    self.init(std.string(title), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = sortAs {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = subtitle {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = identifier {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_Accessibility_ in
      if let __unwrappedValue = accessibility {
        return bridge.create_std__optional_Accessibility_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = modified {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = published {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_std__string__ in
      if let __unwrappedValue = language {
        return bridge.create_std__optional_std__vector_std__string__({ () -> bridge.std__vector_std__string_ in
          var __vector = bridge.create_std__vector_std__string_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(std.string(__item))
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = author {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = translator {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = editor {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = artist {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = illustrator {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = letterer {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = penciler {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = colorist {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = inker {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = narrator {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = contributor {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = publisher {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Contributor__ in
      if let __unwrappedValue = imprint {
        return bridge.create_std__optional_std__vector_Contributor__({ () -> bridge.std__vector_Contributor_ in
          var __vector = bridge.create_std__vector_Contributor_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__vector_Subject__ in
      if let __unwrappedValue = subject {
        return bridge.create_std__optional_std__vector_Subject__({ () -> bridge.std__vector_Subject_ in
          var __vector = bridge.create_std__vector_Subject_(__unwrappedValue.count)
          for __item in __unwrappedValue {
            __vector.push_back(__item)
          }
          return __vector
        }())
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = layout {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = readingProgression {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_std__string_ in
      if let __unwrappedValue = description {
        return bridge.create_std__optional_std__string_(std.string(__unwrappedValue))
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = duration {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_double_ in
      if let __unwrappedValue = numberOfPages {
        return bridge.create_std__optional_double_(__unwrappedValue)
      } else {
        return .init()
      }
    }(), { () -> bridge.std__optional_BelongsTo_ in
      if let __unwrappedValue = belongsTo {
        return bridge.create_std__optional_BelongsTo_(__unwrappedValue)
      } else {
        return .init()
      }
    }())
  }

  @inline(__always)
  var title: String {
    return String(self.__title)
  }
  
  @inline(__always)
  var sortAs: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__sortAs) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__sortAs)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var subtitle: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__subtitle) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__subtitle)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var identifier: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__identifier) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__identifier)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var accessibility: Accessibility? {
    return self.__accessibility.value
  }
  
  @inline(__always)
  var modified: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__modified) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__modified)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var published: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__published) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__published)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var language: [String]? {
    return { () -> [String]? in
      if bridge.has_value_std__optional_std__vector_std__string__(self.__language) {
        let __unwrapped = bridge.get_std__optional_std__vector_std__string__(self.__language)
        return __unwrapped.map({ __item in String(__item) })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var author: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__author) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__author)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var translator: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__translator) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__translator)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var editor: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__editor) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__editor)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var artist: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__artist) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__artist)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var illustrator: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__illustrator) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__illustrator)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var letterer: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__letterer) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__letterer)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var penciler: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__penciler) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__penciler)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var colorist: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__colorist) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__colorist)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var inker: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__inker) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__inker)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var narrator: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__narrator) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__narrator)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var contributor: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__contributor) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__contributor)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var publisher: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__publisher) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__publisher)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var imprint: [Contributor]? {
    return { () -> [Contributor]? in
      if bridge.has_value_std__optional_std__vector_Contributor__(self.__imprint) {
        let __unwrapped = bridge.get_std__optional_std__vector_Contributor__(self.__imprint)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var subject: [Subject]? {
    return { () -> [Subject]? in
      if bridge.has_value_std__optional_std__vector_Subject__(self.__subject) {
        let __unwrapped = bridge.get_std__optional_std__vector_Subject__(self.__subject)
        return __unwrapped.map({ __item in __item })
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var layout: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__layout) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__layout)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var readingProgression: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__readingProgression) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__readingProgression)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var description: String? {
    return { () -> String? in
      if bridge.has_value_std__optional_std__string_(self.__description) {
        let __unwrapped = bridge.get_std__optional_std__string_(self.__description)
        return String(__unwrapped)
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var duration: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__duration) {
        let __unwrapped = bridge.get_std__optional_double_(self.__duration)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var numberOfPages: Double? {
    return { () -> Double? in
      if bridge.has_value_std__optional_double_(self.__numberOfPages) {
        let __unwrapped = bridge.get_std__optional_double_(self.__numberOfPages)
        return __unwrapped
      } else {
        return nil
      }
    }()
  }
  
  @inline(__always)
  var belongsTo: BelongsTo? {
    return self.__belongsTo.value
  }
}
