   Returns `{body_binary, size}`
 
   """
+  @spec encode_form(parts :: [part_t]) :: {boundary_t, integer}
   def encode_form(parts), do: encode_form(new_boundary(), parts)
   @doc """
   multipart form encode.

  defp join([s | rest], separator, acc), do: join(rest, separator, [s, separator | acc])

end


  @moduledoc  """
  Process mutipart for adapter
  """
  @type param_t :: {String.t, String.t}
  @type params_t :: [param_t]
  @type header_t :: {String.t, String.t} | {String.t, String.t, params_t}
  @type headers_t :: Keyword.t
  @type disposition_t :: {String.t, params_t}
  @type boundary_t :: String.t
  @type name_t :: String.t
  @type part_t :: {:file, Path.t}
              | {:file, Path.t, headers_t}
              | {:file, Path.t, disposition_t, headers_t}
              | {:mp_mixed, String.t, boundary_t}
              | {:mp_mixed_eof, boundary_t}
              | {name_t, binary}
              | {name_t, binary, headers_t}
              | {name_t, binary, disposition_t, headers_t}
  @type t :: {:multipart, [part_t]}
  @eof_size 2
  @doc """
  multipart form encode.
