Books a room given the required information.

        :param item:
            The ID of the room to book.
        :type item: int
        :param start:
            The start time range of when to book the room, in the format returned by the LibCal API.
        :type start: str
        :param end:
            The end time range of when to book the room, in the format returned by the LibCal API.
        :type end: str
        :param fname:
            The first name of the user booking the room.
        :type fname: str
        :param lname:
            The last name of the user booking the room.
        :type lname: str
        :param email:
            The email of the user booking the room.
        :type email: str
        :param nickname:
            The name of the reservation.
        :type nickname: str
        :param custom:
            Any other custom fields required to book the room.
        :type custom: dict
        :param test:
            If this is set to true, don't actually book the room. Default is false.
        :type test: bool
        :returns:
            Dictionary containing a success and error field.

def book_room(self, item, start, end, fname, lname, email, nickname, custom={}, test=False):
        """Books a room given the required information.

        :param item:
            The ID of the room to book.
        :type item: int
        :param start:
            The start time range of when to book the room, in the format returned by the LibCal API.
        :type start: str
        :param end:
            The end time range of when to book the room, in the format returned by the LibCal API.
        :type end: str
        :param fname:
            The first name of the user booking the room.
        :type fname: str
        :param lname:
            The last name of the user booking the room.
        :type lname: str
        :param email:
            The email of the user booking the room.
        :type email: str
        :param nickname:
            The name of the reservation.
        :type nickname: str
        :param custom:
            Any other custom fields required to book the room.
        :type custom: dict
        :param test:
            If this is set to true, don't actually book the room. Default is false.
        :type test: bool
        :returns:
            Dictionary containing a success and error field.
        """
        data = {
            "start": start,
            "fname": fname,
            "lname": lname,
            "email": email,
            "nickname": nickname,
            "bookings": [
                {
                    "id": item,
                    "to": end
                }
            ],
            "test": test
        }
        data.update(custom)
        resp = self._request("POST", "/1.1/space/reserve", json=data)
        out = resp.json()
        if "errors" in out and "error" not in out:
            errors = out["errors"]
            if isinstance(errors, list):
                errors = " ".join(errors)
            out["error"] = BeautifulSoup(errors.replace("\n", " "), "html.parser").text.strip()
            del out["errors"]
        if "results" not in out:
            if "error" not in out:
                out["error"] = None
                out["results"] = True
            else:
                out["results"] = False
        return out