     |> do_place_bombs(pid)
   end
 
+  @doc """
+  Parses, normalizes, and validates a given coordinate.
+
+  It will parse any of the valid `LexibombServer.Board.coord` forms and will
+  normalize them to the underlying `LexibombServer.Board.Grid.coord` type. If
+  indicating the column with a string, you can use either uppercase or
+  lowercase letters, and you may also optionally separate the row and column
+  with whitespace.
+
+  Validation also occurs to ensure that the coordinate given is actually
+  a square on the board.
+
+  ## Examples
+
+    > LexibombServer.Board.parse_coord "10B"
+    {:ok, {10, 2}}
+    > LexibombServer.Board.parse_coord "10 b"
+    {:ok, {10, 2}}
+    > LexibombServer.Board.parse_coord {10, "B"}
+    {:ok, {10, 2}}
+    > LexibombServer.Board.parse_coord {10, 2}
+    {:ok, {10, 2}}
+    > LexibombServer.Board.parse_coord {10, ""}
+    {:error, :invalid_coord}
+
+  Returns  `{:ok, {row, col}} on success, or {:error, :invalid_coord} on failure.
+  """
   @spec parse_coord(pid, coord) :: {:ok, Grid.coord} | {:error, :invalid_coord}
-  defp parse_coord(pid, coord) when is_binary(coord) do
+  def parse_coord(pid, coord) when is_binary(coord) do
     {row_string, letter} = coord |> String.split_at(-1)
 
     try do

    end
  end

  defp parse_coord(pid, {row, letter}) when is_binary(letter) do
    col = letter_to_col(letter)
    parse_coord(pid, {row, col})
  end

  defp parse_coord(pid, {row, col}) do
    grid = get(pid).grid

    if Grid.valid_coord?(grid, {row, col}) do

    end)
  end

  @doc """
  Places a bomb on `count` number of randomly selected board squares.
  """
  @spec place_random_bombs(pid, pos_integer) :: :ok
  def place_random_bombs(pid, count \\ @bomb_count) do
    board = get(pid)
