#
# Copyright (c) 2012,2016,2022 LAAS/CNRS
# All rights reserved.
#
# Permission to use, copy, modify, and distribute this software for any purpose
# with or without   fee is hereby granted, provided   that the above  copyright
# notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
# REGARD TO THIS  SOFTWARE INCLUDING ALL  IMPLIED WARRANTIES OF MERCHANTABILITY
# AND FITNESS. IN NO EVENT SHALL THE AUTHOR  BE LIABLE FOR ANY SPECIAL, DIRECT,
# INDIRECT, OR CONSEQUENTIAL DAMAGES OR  ANY DAMAGES WHATSOEVER RESULTING  FROM
# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
# OTHER TORTIOUS ACTION,   ARISING OUT OF OR IN    CONNECTION WITH THE USE   OR
# PERFORMANCE OF THIS SOFTWARE.
#
#                                            Anthony Mallet on Fri Mar 23 2012
#

namespace eval uri {
  variable specials {
    % " " ; ? : @ & = + $ , < > # \" \{ \} | / \\ ^ \[ \] `
  }

  variable specialsx {}
  foreach c $specials {
    lappend specialsx [format "%%%02x" [scan $c %c]]
  }

  # rewrite "+" back to space
  # rewrite %-escapes to unicode chars
  variable decmap [list + { }]
  foreach s $specials c $specialsx {
    lappend decmap $c $s
  }


  # --- decode-args --------------------------------------------------------
  #
  proc decode-args { uri argname } {
    variable decmap
    upvar $argname arg
    set arg [dict create]

    set rest [lassign [split $uri ?] path]
    decode-form $rest arg

    return [string map -nocase $decmap $path]
  }
  namespace export decode-args


  # --- decode-form --------------------------------------------------------
  #
  proc decode-form { data argname } {
    variable decmap
    upvar $argname arg
    set arg [dict create]

    foreach a [split $data &] {
      set value [join [lassign [split $a =] key] =]
      dict set arg \
          [string map -nocase $decmap $key] [string map -nocase $decmap $value]
    }
  }
  namespace export decode-form


  # create 'uri' command
  namespace ensemble create
}
