aboutsummaryrefslogtreecommitdiff
path: root/lib/IO/Path/XDG.pm6
blob: 40730f4d9010fd2df02885399c6c171703a02db4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#! /usr/bin/env false

use v6.d;

unit module IO::Path::XDG;

#| Returns an IO::Path for $XDG_CONFIG_HOME, if it exists as environment
#| variable. Otherwise, return the default value, $HOME/.config. This directory
#| should contain user-specific configuration files.
sub xdg-config-home (
	--> IO::Path
) is export {
	return %*ENV<XDG_CONFIG_HOME>.IO if %*ENV<XDG_CONFIG_HOME>:exists;

	$*HOME.add(".config");
}

#| Returns an IO::Path for $XDG_CACHE_HOME, if it exists as environment
#| variable. Otherwise, return the default value, $HOME/.cache. This directory
#| should contain user-specific, non-essential (cached) data.
sub xdg-cache-home (
	--> IO::Path
) is export {
	return %*ENV<XDG_CACHE_HOME>.IO if %*ENV<XDG_CACHE_HOME>:exists;

	$*HOME.IO.add(".cache");
}

#| Returns an IO::Path for $XDG_DATA_HOME, if it exists as environment
#| variable. Otherwise, return the default value, $HOME/.local/share. This
#| directory should contain user-specific data files.
sub xdg-data-home (
	--> IO::Path
) is export {
	return %*ENV<XDG_DATA_HOME>.IO if %*ENV<XDG_DATA_HOME>:exists;

	$*HOME.add(".local/share");
}

#| Returns an IO::Path for $XDG_RUNTIME_DIR, if it exists as environment
#| variable. Otherwise, return an IO::Path to a temporary directory. This
#| directory should contain user-specific runtime files and other file objects.
sub xdg-runtime-dir (
	--> IO::Path
) is export {
	return %*ENV<XDG_RUNTIME_DIR>.IO if %*ENV<XDG_RUNTIME_DIR>:exists;

	# XDG_RUNTIME_DIR is the only XDG basedir variant that does not come with
	# defaults. However, there are a number of de facto standard locations to
	# make use of. Try them, and return whichever hits first that also seems to
	# exist on the user's system.
	[
		"/var/run".IO.add(+$*USER),
		"/var/run".IO.add(~$*USER),
		$*HOME.add(".local/run"),
		$*TMPDIR,
		$*CWD,
	]
	.grep(*.d)
	.first
	.add($*PID)
}

=begin pod

=NAME    IO::Path::XDG
=AUTHOR  Patrick Spek <p.spek@tyil.work>
=VERSION 0.1.0

=head1 Synopsis

=head1 Description

=head1 Examples

=head1 See also

=end pod

# vim: ft=perl6 noet