code: func Parse(rawuri string) (*URI, error) {
  	u, err := url.Parse(rawuri)
  	if err != nil {
  		return nil, err
  	}
  	uri := &URI{Scheme: u.Scheme}
  
  	// check the scheme is valid
  	switch uri.Scheme {
  	case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzz-feed":
  	default:
  		return nil, fmt.Errorf("unknown scheme %q", u.Scheme)
  	}
  
  	// handle URIs like bzz://<addr>/<path> where the addr and path
  	// have already been split by url.Parse
  	if u.Host != "" {
  		uri.Addr = u.Host
  		uri.Path = strings.TrimLeft(u.Path, "/")
  		return uri, nil
  	}
  
  	// URI is like bzz:/<addr>/<path> so split the addr and path from
  	// the raw path (which will be /<addr>/<path>)
  	parts := strings.SplitN(strings.TrimLeft(u.Path, "/"), "/", 2)
  	uri.Addr = parts[0]
  	if len(parts) == 2 {
  		uri.Path = parts[1]
  	}
  	return uri, nil
  }
docs: // Parse parses rawuri into a URI struct, where rawuri is expected to have one
  // of the following formats:
  //
  // * <scheme>:/
  // * <scheme>:/<addr>
  // * <scheme>:/<addr>/<path>
  // * <scheme>://
  // * <scheme>://<addr>
  // * <scheme>://<addr>/<path>
  //
  // with scheme one of bzz, bzz-raw, bzz-immutable, bzz-list or bzz-hash