 import BSON
 
+/// A WriteConcern describes the requested level of acknowledgement for a Write operation such as `delete`, `update` or `insert`.
 public enum WriteConcern: ValueConvertible {
+    /// Best described here: https://docs.mongodb.com/manual/reference/write-concern/
+    ///
+    /// w: When set to `1` it'll request acknowledgement, `0` will request no acknowledgement for the Write operation
+    /// When set to "majority" this will request acknowledgement of the majority of nodes within a cluster or replica set
+    ///
+    /// j: Acknowledgement for the completion of writing this information to the journal
+    ///
+    /// wTimeout: The time in milliseconds that's being waited for the acknowledgement. An error will be thrown otherwise.
     case custom(w: ValueConvertible, j: Bool?, wTimeout: Int)
     
+    /// Converts this WriteConcern to a BSONPrimitive for embedding
     public func makeBSONPrimitive() -> BSONPrimitive {
         switch self {
         case .custom(let w, let j, let timeout):

        ] as Document
    }
    
    public enum IgnorableCharacters: String, CustomValueConvertible {
        case punct = "punct"
        case space = "space"
        
        public init?(_ value: BSONPrimitive) {
            guard let string = value.string else {
                return nil

            }
        }
        
        /// Converts this to a BSONPrimitive
        public func makeBSONPrimitive() -> BSONPrimitive {
            return self.rawValue
        }
    }
    
    /// The ICU comparison level: http://userguide.icu-project.org/collation/concepts#TOC-Comparison-Levels
    public enum Strength: Int32, CustomValueConvertible {
        /// 1: Performs comparisons of the base characters only, ignoring other differences such as diacritics and case
        case primary = 1
        
        /// 2: Performs comparisons up to secondary differences, such as diacritics.
        case secondary = 2
        
        /// 3 (default): Performs comparisons up to tertiary differences, such as case and letter variants.
        case tertiary = 3
        
        /// 4: Same as 3, but requires proper punctuation or for comparing japanese text
        case quaternary = 4
        
        /// 5: Identical texts
        case identical = 5
        
        /// Creates a Strength instance from a BSONPrimitive
        public init?(_ value: BSONPrimitive) {
            guard let number = value.int32 else {
                return nil
