🧑💻 Added ShiftPath util
This commit is contained in:
parent
2c705e6142
commit
ae7c02a85c
|
@ -0,0 +1,22 @@
|
|||
package urlutil
|
||||
|
||||
import (
|
||||
"path"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// ShiftPath splits off the first component of p, which will be cleaned of
|
||||
// relative components before processing. head will never contain a slash and
|
||||
// tail will always be a rooted path without trailing slash.
|
||||
//
|
||||
// See: https://blog.merovius.de/posts/2017-06-18-how-not-to-use-an-http-router/
|
||||
func ShiftPath(p string) (head, tail string) {
|
||||
p = path.Clean("/" + p)
|
||||
|
||||
i := strings.Index(p[1:], "/") + 1
|
||||
if i <= 0 {
|
||||
return p[1:], "/"
|
||||
}
|
||||
|
||||
return p[1:i], p[i:]
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
package urlutil_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"source.toby3d.me/toby3d/home/internal/urlutil"
|
||||
)
|
||||
|
||||
func TestShiftPath(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
for name, tc := range map[string]struct {
|
||||
input, expectHead, expectTail string
|
||||
}{
|
||||
"root": {"/", "", "/"},
|
||||
"file": {"/foo", "foo", "/"},
|
||||
"dir": {"/foo/", "foo", "/"},
|
||||
"dir-file": {"/foo/bar", "foo", "/bar"},
|
||||
"subdir": {"/foo/bar/", "foo", "/bar"},
|
||||
} {
|
||||
name, tc := name, tc
|
||||
|
||||
t.Run(name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
head, tail := urlutil.ShiftPath(tc.input)
|
||||
if head != tc.expectHead {
|
||||
t.Errorf("ShiftPath(%s) = '%s', want '%s'", tc.input, head, tc.expectHead)
|
||||
}
|
||||
|
||||
if tail != tc.expectTail {
|
||||
t.Errorf("ShiftPath(%s) = '%s', want '%s'", tc.input, tail, tc.expectTail)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue