# pathtype

package module
Version: v0.4.3 Latest Latest

Go to latest
Published: Aug 5, 2021 License: MIT

### pathtype

Treat paths as their own type instead of using strings. This small package wraps functions from the standard library to create a new Path type.

#### Example

##### Code
package main

import (
"fmt"
"log"

pt "github.com/jonchun/pathtype"
)

type path = pt.Path

func main() {
myFile := path("myfile.txt")
exampleFile := path("example/example.txt")
fmt.Println(exampleFile.Dir())
fmt.Println(exampleFile.Dir().Join(myFile))

res, err := exampleFile.Dir().Join(myFile).Dir().Abs()
if err != nil {
log.Fatal(err)
}
fmt.Println(res)

fmt.Println("=========================")
listBase(res)
fmt.Println("=========================")
listExt(res)
}

// list all Base for files in p
func listBase(p path) {
if glob, err := p.Glob("*"); err != nil {
log.Fatal(err)
} else {
for _, match := range glob {
fmt.Println(match.Base())
}
}
}

// list all extensions for files in p
func listExt(p path) {
if glob, err := p.Glob("*"); err != nil {
log.Fatal(err)
} else {
for _, match := range glob {
fmt.Println(match.Ext())
}
}
}

##### Output
example
example/myfile.txt
/home/jonchun/example_module/example
=========================
1.log
2.log
example.txt
=========================
.log
.log
.txt


See GoDoc for documentation, but it should be pretty self-explanatory.

#### TODO

• Update examples for all the methods and have 1-to-1 coverage of the official examples/docs.

## Documentation ¶

### Constants ¶

This section is empty.

### Variables ¶

This section is empty.

### Functions ¶

This section is empty.

### Types ¶

#### type Path ¶

type Path string

Path is a custom type representing a path that is implemented by wrapping the standard library.

#### func Executable ¶

func Executable() (Path, error)

Executable returns the path name for the executable that started the current process. There is no guarantee that the path is still pointing to the correct executable. If a symlink was used to start the process, depending on the operating system, the result might be the symlink or the path it pointed to. If a stable result is needed, path/filepath.EvalSymlinks might help.

Executable returns an absolute path unless an error occurred.

The main use case is finding resources located relative to an executable.

#### func Getwd ¶

func Getwd() (dir Path, err error)

Getwd returns a rooted path name corresponding to the current directory. If the current directory can be reached via multiple paths (due to symbolic links), Getwd may return any one of them.

#### func SplitList ¶

func SplitList(path string) []Path

SplitList splits a list of paths joined by the OS-specific ListSeparator, usually found in PATH or GOPATH environment variables. Unlike strings.Split, SplitList returns an empty slice when passed an empty string.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
fmt.Println("On Unix:", pt.SplitList("/a/b/c:/usr/bin"))
}

Output:

On Unix: [/a/b/c /usr/bin]


#### func TempDir ¶

func TempDir() Path

TempDir returns the default directory to use for temporary files.

#### func UserCacheDir ¶

func UserCacheDir() (Path, error)

UserCacheDir returns the default root directory to use for user-specific cached data. Users should create their own application-specific subdirectory within this one and use that.

#### func UserConfigDir ¶

func UserConfigDir() (Path, error)

UserConfigDir returns the default root directory to use for user-specific configuration data. Users should create their own application-specific subdirectory within this one and use that.

#### func UserHomeDir ¶

func UserHomeDir() (Path, error)

UserHomeDir returns the current user's home directory.

#### func (Path) Abs ¶

func (path Path) Abs() (Path, error)

Abs returns an absolute representation of path. If the path is not absolute it will be joined with the current working directory to turn it into an absolute path. The absolute path name for a given file is not guaranteed to be unique. Abs calls Clean on the result.

#### func (Path) Base ¶

func (path Path) Base() Path

Base returns the last element of path. Trailing path separators are removed before extracting the last element. If the path is empty, Base returns ".". If the path consists entirely of separators, Base returns a single separator.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
type path = pt.Path
fmt.Println("On Unix:")
fmt.Println(path("/foo/bar/baz.js").Base())
fmt.Println(path("/foo/bar/baz").Base())
fmt.Println(path("/foo/bar/baz/").Base())
fmt.Println(path("dev.txt").Base())
fmt.Println(path("../todo.txt").Base())
fmt.Println(path("..").Base())
fmt.Println(path(".").Base())
fmt.Println(path("/").Base())
fmt.Println(path("").Base())

}

Output:

On Unix:
baz.js
baz
baz
dev.txt
todo.txt
..
.
/
.


#### func (Path) Chdir ¶

func (path Path) Chdir() error

Chdir changes the current working directory to the directory at path. If there is an error, it will be of type *os.PathError.

#### func (Path) Chmod ¶

func (path Path) Chmod(mode os.FileMode) error

Chmod changes the mode of the file at path to mode. If there is an error, it will be of type *os.PathError.

#### func (Path) Chown ¶

func (path Path) Chown(uid, gid int) error

Chown changes the numeric uid and gid of the file at path. If there is an error, it will be of type *os.PathError. On Windows, it always returns the syscall.EWINDOWS error, wrapped in *os.PathError.

#### func (Path) Chtimes ¶

func (path Path) Chtimes(atime time.Time, mtime time.Time) error

Chtimes changes the access and modification times of the file at path. If there is an error, it will be of type *os.PathError.

#### func (Path) Clean ¶

func (path Path) Clean() Path

Clean returns the shortest path name equivalent to path by purely lexical processing. It applies the following rules iteratively until no further processing can be done:

1. Replace multiple Separator elements with a single one.
2. Eliminate each . path name element (the current directory).
3. Eliminate each inner .. path name element (the parent directory)
along with the non-.. element that precedes it.
4. Eliminate .. elements that begin a rooted path:
that is, replace "/.." by "/" at the beginning of a path,
assuming Separator is '/'.


The returned path ends in a slash only if it represents a root directory, such as "/" on Unix or C:\ on Windows.

Finally, any occurrences of slash are replaced by Separator.

If the result of this process is an empty string, Clean returns the string ".".

See also Rob Pike, “Lexical File Names in Plan 9 or Getting Dot-Dot Right,” https://9p.io/sys/doc/lexnames.html

#### func (Path) Create ¶

func (path Path) Create() (*os.File, error)

Create creates or truncates the file at path. If the file already exists, it is truncated. If the file does not exist, it is created with mode 0666 (before umask). If successful, methods on the returned File can be used for I/O; the associated file descriptor has mode os.O_RDWR. If there is an error, it will be of type *os.PathError.

#### func (Path) CreateTemp ¶

func (path Path) CreateTemp(pattern string) (*os.File, error)

CreateTemp creates a new temporary file in the directory at path, opens the file for reading and writing, and returns the resulting file. The filename is generated by taking pattern and adding a random string to the end. If pattern includes a "*", the random string replaces the last "*". If the path is empty, CreateTemp uses the default directory for temporary files, as returned by TempDir. Multiple programs or goroutines calling CreateTemp simultaneously will not choose the same file. The caller can use the file's Name method to find the pathname of the file. It is the caller's responsibility to remove the file when it is no longer needed.

#### func (Path) Dir ¶

func (path Path) Dir() Path

Dir returns all but the last element of path, typically the path's directory. After dropping the final element, Dir calls Clean on the path and trailing slashes are removed. If the path is empty, Dir returns ".". If the path consists entirely of separators, Dir returns a single separator. The returned path does not end in a separator unless it is the root directory.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
type path = pt.Path
fmt.Println("On Unix:")
fmt.Println(path("/foo/bar/baz.js").Dir())
fmt.Println(path("/foo/bar/baz").Dir())
fmt.Println(path("/foo/bar/baz/").Dir())
fmt.Println(path("/dirty//path///").Dir())
fmt.Println(path("dev.txt").Dir())
fmt.Println(path("../todo.txt").Dir())
fmt.Println(path("..").Dir())
fmt.Println(path(".").Dir())
fmt.Println(path("/").Dir())
fmt.Println(path("").Dir())

}

Output:

On Unix:
/foo/bar
/foo/bar
/foo/bar/baz
/dirty/path
.
..
.
.
/
.


#### func (Path) DirFS ¶

func (path Path) DirFS() fs.FS

DirFS returns a file system (an fs.FS) for the tree of files rooted at the directory at path.

func (path Path) EvalSymlinks() (Path, error)

EvalSymlinks returns path's name after the evaluation of any symbolic links. If path is relative the result will be relative to the current directory, unless one of the components is an absolute symbolic link. EvalSymlinks calls Clean on the result.

#### func (Path) Ext ¶

func (path Path) Ext() string

Ext returns the file name extension used by path. The extension is the suffix beginning at the final dot in the final element of path; it is empty if there is no dot.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
type path = pt.Path
fmt.Printf("No dots: %q\n", path("index").Ext())
fmt.Printf("One dot: %q\n", path("index.js").Ext())
fmt.Printf("Two dots: %q\n", path("main.test.js").Ext())
}

Output:

No dots: ""
One dot: ".js"
Two dots: ".js"


#### func (Path) FromSlash ¶

func (path Path) FromSlash() Path

FromSlash returns the result of replacing each slash ('/') character in path with a separator character. Multiple slashes are replaced by multiple separators.

#### func (Path) Glob ¶

func (path Path) Glob(pattern string) (matches []Path, err error)

Glob returns the names of all files matching path.Join(pattern) or nil if there is no matching file. The syntax of patterns is the same as in Match. The pattern may describe hierarchical names such as /usr/*/bin/ed (assuming the Separator is '/').

Glob ignores file system errors such as I/O errors reading directories. The only possible returned error is ErrBadPattern, when pattern is malformed.

#### func (Path) IsAbs ¶

func (path Path) IsAbs() bool

IsAbs reports whether the path is absolute.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
type path = pt.Path
fmt.Println("On Unix:")
fmt.Println(path("/home/gopher").IsAbs())
fmt.Println(path(".bashrc").IsAbs())
fmt.Println(path("..").IsAbs())
fmt.Println(path(".").IsAbs())
fmt.Println(path("/").IsAbs())
fmt.Println(path("").IsAbs())

}

Output:

On Unix:
true
false
false
false
true
false


#### func (Path) Join ¶

func (path Path) Join(elem ...Path) Path

Join joins any number of path elements into path, separating them with an OS specific Separator. Empty elements are ignored. The result is Cleaned. However, if the argument list is empty or all its elements are empty, Join returns an empty string. On Windows, the result will only be a UNC path if the first non-empty element is a UNC path.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
type path = pt.Path
fmt.Println("On Unix:")
fmt.Println(path("a").Join(path("b"), path("c")))
fmt.Println(path("a").Join(path("b/c")))
fmt.Println(path("a/b").Join(path("c")))
fmt.Println(path("a/b").Join(path("/c")))

fmt.Println(path("a/b").Join(path("../../../xyz")))

}

Output:

On Unix:
a/b/c
a/b/c
a/b/c
a/b/c
../xyz


#### func (Path) Lchown ¶

func (path Path) Lchown(uid, gid int) error

Lchown changes the numeric uid and gid of the file at path. If the file is a symbolic link, it changes the uid and gid of the link itself. If there is an error, it will be of type *PathError.

On Windows, it always returns the syscall.EWINDOWS error, wrapped in *os.PathError.

func (path Path) Link(newname Path) error

Link creates newname as a hard link to path. If there is an error, it will be of type *os.LinkError.

#### func (Path) Lstat ¶

func (path Path) Lstat() (os.FileInfo, error)

Lstat returns a FileInfo describing the file at path. If the file is a symbolic link, the returned FileInfo describes the symbolic link. Lstat makes no attempt to follow the link. If there is an error, it will be of type *os.PathError.

#### func (Path) Match ¶

func (path Path) Match(pattern string) (bool, error)

Match reports whether the path matches the shell file name pattern. The pattern syntax is:

pattern:
{ term }
term:
'*'         matches any sequence of non-Separator characters
'?'         matches any single non-Separator character
'[' [ '^' ] { character-range } ']'
character class (must be non-empty)
c           matches character c (c != '*', '?', '\\', '[')
'\\' c      matches character c

character-range:
c           matches character c (c != '\\', '-', ']')
'\\' c      matches character c
lo '-' hi   matches character c for lo <= c <= hi


Match requires pattern to match all of name, not just a substring. The only possible returned error is ErrBadPattern, when pattern is malformed.

On Windows, escaping is disabled. Instead, '\\' is treated as path separator.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
type path = pt.Path
fmt.Println("On Unix:")
fmt.Println(path("/home/catch/foo").Match("/home/catch/*"))
fmt.Println(path("/home/catch/foo/bar").Match("/home/catch/*"))
fmt.Println(path("/home/gopher").Match("/home/?opher"))
fmt.Println(path("/home/*").Match("/home/\\*"))

}

Output:

On Unix:
true <nil>
false <nil>
true <nil>
true <nil>


#### func (Path) Mkdir ¶

func (path Path) Mkdir(perm os.FileMode) error

Mkdir creates a new directory at path with the specified permission bits (before umask). If there is an error, it will be of type *os.PathError.

#### func (Path) MkdirAll ¶

func (path Path) MkdirAll(perm os.FileMode) error

MkdirAll creates a directory at path, along with any necessary parents, and returns nil, or else returns an error. The permission bits perm (before umask) are used for all directories that MkdirAll creates. If path is already a directory, MkdirAll does nothing and returns nil.

#### func (Path) MkdirTemp ¶

func (path Path) MkdirTemp(pattern string) (Path, error)

MkdirTemp creates a new temporary directory at path and returns the pathname of the new directory. The new directory's name is generated by adding a random string to the end of pattern. If pattern includes a "*", the random string replaces the last "*" instead. If path is empty, MkdirTemp uses the default directory for temporary files, as returned by TempDir. Multiple programs or goroutines calling MkdirTemp simultaneously will not choose the same directory. It is the caller's responsibility to remove the directory when it is no longer needed.

#### func (Path) Open ¶

func (path Path) Open() (*os.File, error)

Open opens the file at path for reading. If successful, methods on the returned file can be used for reading; the associated file descriptor has mode os.O_RDONLY. If there is an error, it will be of type *os.PathError.

#### func (Path) OpenFile ¶

func (path Path) OpenFile(flag int, perm os.FileMode) (*os.File, error)

OpenFile is the generalized open call; most users will use Open or Create instead. It opens the file at path with specified flag (O_RDONLY etc.). If the file does not exist, and the O_CREATE flag is passed, it is created with mode perm (before umask). If successful, methods on the returned File can be used for I/O. If there is an error, it will be of type *os.PathError.

func (path Path) ReadDirFS(fsys fs.FS) ([]fs.DirEntry, error)

ReadDirFS reads the directory at path in FS fsys. and returns a list of directory entries sorted by filename.

func (path Path) Readlink() (Path, error)

Readlink returns the destination of the symbolic link at path. If there is an error, it will be of type *os.PathError.

#### func (Path) Rel ¶

func (path Path) Rel(targpath Path) (Path, error)

Rel returns a relative path that is lexically equivalent to targpath when joined to path with an intervening separator. That is, path.Join(path.Rel(targpath)) is equivalent to targpath itself. On success, the returned path will always be relative to path, even if path and targpath share no elements. An error is returned if targpath can't be made relative to path or if knowing the current working directory would be necessary to compute it. Rel calls Clean on the result.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
type path = pt.Path

paths := []path{
path("/a/b/c"),
path("/b/c"),
path("./b/c"),
}
base := path("/a")

fmt.Println("On Unix:")
for _, p := range paths {
rel, err := base.Rel(p)
fmt.Printf("%q: %q %v\n", p, rel, err)
}

}

Output:

On Unix:
"/a/b/c": "b/c" <nil>
"/b/c": "../b/c" <nil>
"./b/c": "" Rel: can't make ./b/c relative to /a


#### func (Path) Remove ¶

func (path Path) Remove() error

Remove removes path. If there is an error, it will be of type *os.PathError.

#### func (Path) RemoveAll ¶

func (path Path) RemoveAll() error

RemoveAll removes path and any children it contains. It removes everything it can but returns the first error it encounters. If the path does not exist, RemoveAll returns nil (no error). If there is an error, it will be of type *os.PathError.

#### func (Path) Rename ¶

func (path Path) Rename(newpath Path) error

Rename renames (moves) path to newpath. If newpath already exists and is not a directory, Rename replaces it. OS-specific restrictions may apply when path and newpath are in different directories. If there is an error, it will be of type *os.LinkError.

#### func (Path) Split ¶

func (path Path) Split() (dir, file Path)

Split splits the path immediately following the final Separator, separating it into a directory and file name component. If there is no Separator in path, Split returns an empty dir and file set to path. The returned values have the property that path = dir+file.

Example
package main

import (
"fmt"

pt "github.com/jonchun/pathtype"
)

func main() {
type path = pt.Path

paths := []path{
path("/home/arnie/amelia.jpg"),
path("/mnt/photos/"),
path("rabbit.jpg"),
path("/usr/local//go"),
}
fmt.Println("On Unix:")
for _, p := range paths {
dir, file := p.Split()
fmt.Printf("input: %q\n\tdir: %q\n\tfile: %q\n", p, dir, file)
}
}

Output:

On Unix:
input: "/home/arnie/amelia.jpg"
dir: "/home/arnie/"
file: "amelia.jpg"
input: "/mnt/photos/"
dir: "/mnt/photos/"
file: ""
input: "rabbit.jpg"
dir: ""
file: "rabbit.jpg"
input: "/usr/local//go"
dir: "/usr/local//"
file: "go"


#### func (Path) Stat ¶

func (path Path) Stat() (os.FileInfo, error)

Stat returns a FileInfo describing the file at path. If there is an error, it will be of type *os.PathError.

#### func (Path) Sub ¶

func (path Path) Sub(fsys fs.FS) (fs.FS, error)

Sub returns an FS corresponding to the subtree rooted at fsys's directory located at path.

func (path Path) Symlink(newname Path) error

Symlink creates newname as a symbolic link to the path. If there is an error, it will be of type *os.LinkError..

#### func (Path) ToSlash ¶

func (path Path) ToSlash() Path

ToSlash returns the result of replacing each separator character in path with a slash ('/') character. Multiple separators are replaced by multiple slashes.

#### func (Path) Truncate ¶

func (path Path) Truncate(size int64) error

Truncate changes the size of the path. If the file is a symbolic link, it changes the size of the link's target. If there is an error, it will be of type *os.PathError.

#### func (Path) ValidPath ¶

func (path Path) ValidPath() bool

ValidPath reports whether the given path is valid for use in a call to Open.

Path names passed to open are UTF-8-encoded, unrooted, slash-separated sequences of path elements, like “x/y/z”. Path names must not contain an element that is “.” or “..” or the empty string, except for the special case that the root directory is named “.”. Paths must not start or end with a slash: “/x” and “x/” are invalid.

Note that paths are slash-separated on all systems, even Windows. Paths containing other characters such as backslash and colon are accepted as valid, but those characters must never be interpreted by an FS implementation as path element separators.

#### func (Path) VolumeName ¶

func (path Path) VolumeName() Path

VolumeName returns leading volume name. Given "C:\foo\bar" it returns "C:" on Windows. Given "\\host\share\foo" it returns "\\host\share". On other platforms it returns "".

#### func (Path) Walk ¶

func (path Path) Walk(fn WalkFunc) error

Walk walks the file tree rooted at path, calling fn for each file or directory in the tree, including path.

All errors that arise visiting files and directories are filtered by fn: see the WalkFunc documentation for details.

The files are walked in lexical order, which makes the output deterministic but requires Walk to read an entire directory into memory before proceeding to walk that directory.

Walk is less efficient than WalkDir, introduced in Go 1.16, which avoids calling os.Lstat on every visited file or directory.

#### func (Path) WalkDir ¶

func (path Path) WalkDir(fn WalkDirFunc) error

WalkDir walks the file tree rooted at path, calling fn for each file or directory in the tree, including path.

All errors that arise visiting files and directories are filtered by fn: see the fs.WalkDirFunc documentation for details.

The files are walked in lexical order, which makes the output deterministic but requires WalkDir to read an entire directory into memory before proceeding to walk that directory.

#### func (Path) WriteFile ¶

func (path Path) WriteFile(data []byte, perm os.FileMode) error

WriteFile writes data to the file at path, creating it if necessary. If the file does not exist, WriteFile creates it with permissions perm (before umask); otherwise WriteFile truncates it before writing, without changing permissions.

#### type WalkDirFunc ¶

type WalkDirFunc func(path Path, d fs.DirEntry, err error) error

WalkDirFunc is the type of the function called by WalkDir to visit each file or directory.

#### type WalkFunc ¶

type WalkFunc func(path Path, info fs.FileInfo, err error) error

WalkFunc is the type of the function called by Walk to visit each each file or directory.