         let document = try firstDocument(in: try execute(command: command))
         
         guard document["ok"].int32 == 1 else {
-            throw MongoError.CommandFailure
+            throw MongoError.CommandFailure // TODO: Make this more specific
         }
     }
     

        try self.challenge(with: details, using: (nonce: nonce, response: responseDocument, scram: auth))
    }
    
    /// Authenticate with MongoDB Challenge Response
    /// TODO: Set a timeout for connecting
    internal func authenticate(mongoCR details: (username: String, password: String, against: String)) throws {
        // Get the server's nonce
        let response = try self.execute(command: [

        let document = try firstDocument(in: try execute(command: command))
        
        guard document["ok"].int32 == 1 else {
            throw MongoError.CommandFailure // TODO: Make this more specific
        }
    }
    
    /// Grants roles to a user in this database
    ///
    /// For additional information: https://docs.mongodb.com/manual/reference/command/grantRolesToUser/#dbcmd.grantRolesToUser
    ///
    /// - parameter roles: The roles to grants
    /// - parameter user: The user's username to grant the roles to
    ///
    /// - throws: When we can't send the request/receive the response, you don't have sufficient permissions or an error occurred
    public func grant(roles: Document, to user: String) throws {
        let command: Document = [
                                    "grantRolesToUser": ~user,
