Hi, I'd like to propose adding ~URI for constructing URI structs. Here's an example:
  iex> ~URI"https://elixir-lang.org"
  %URI{
   scheme: "https",
   authority: "elixir-lang.org",
   userinfo: nil,
   host: "elixir-lang.org",
   port: 443,
   path: nil,
   query: nil,
   fragment: nil
  }I believe the advantage is we can make this a macro and thus parse the URI string at compile-time
so catch bugs because of incorrect format early (though these are pretty uncommon) and also be a
little bit more efficient at runtime.
If added, I'm not sure whether ~URI should use URI.parse or URI.new! under the hood so an advice
on that would be appreciated.
This is a separate but related discussion so while at it, I'd like to propose adding Inspect
implementation for URI that would return the sigil:
  iex> ~URI"https://elixir-lang.org"
  ~URI"https://elixir-lang.org"I think more compact representation helps e.g. here. Before:
  iex> Req.new(url: "https://elixir-lang.org")
  %Req.Request{
   method: :get,
   url: %URI{
    scheme: "https",
    authority: "elixir-lang.org",
    userinfo: nil,
    host: "elixir-lang.org",
    port: 443,
    path: nil,
    query: nil,
    fragment: nil
   },
   headers: [],
   body: nil,
   options: %{},
   ...
  }After:
  iex> Req.new(url: "https://elixir-lang.org")
  %Req.Request{
   method: :get,
   url: ~URI"https://elixir-lang.org",
   headers: [],
   body: nil,
   options: %{},
   ...
  }On the other hand, seeing the internal representation right away is sometimes useful given the URI
format is somewhat subtle.
Before:
  iex> URI.parse("/foo")
  %URI{
   scheme: nil,
   userinfo: nil,
   host: nil,
   port: nil,
   path: "/foo",
   query: nil,
   fragment: nil
  }
  iex> URI.parse("//foo")
  %URI{
   scheme: nil,
   authority: "foo",
   userinfo: nil,
   host: "foo",
   port: nil,
   path: nil,
   query: nil,
   fragment: nil
  }After:
  iex> URI.parse("/foo")
  ~URI"/foo"
  iex> URI.parse("//foo")
  ~URI"//foo"I think this downside can be alleviated by adding `IEx.Info` implementation along these lines:
  iex> i URI.parse("/foo")
  Term
   ~URI"/foo"
  Data type
   URI
  Raw representation
   %URI{
    scheme: nil,
    userinfo: nil,
    host: nil,
    port: nil,
    path: "/foo",
    query: nil,
    fragment: nil
   }