1 module deimos.xdgbasedir.basedir;
2 
3 package {
4     static if( __VERSION__ < 2066 ) enum nogc = 1;
5 }
6 
7 struct xdgHandle {
8     void *reserved;
9 };
10 
11 extern(C) @nogc @system nothrow {
12     xdgHandle * xdgInitHandle(xdgHandle *handle);
13 
14     void xdgWipeHandle(xdgHandle *handle);
15     int xdgUpdateData(xdgHandle *handle);
16     const(char)* xdgDataHome(xdgHandle *handle);
17     const(char)* xdgConfigHome(xdgHandle *handle);
18 
19     const(char*)* xdgDataDirectories(xdgHandle *handle);
20     const(char*)* xdgSearchableDataDirectories(xdgHandle *handle);
21     const(char*)* xdgConfigDirectories(xdgHandle *handle);
22     const(char*)* xdgSearchableConfigDirectories(xdgHandle *handle);
23     const(char)* xdgCacheHome(xdgHandle *handle);
24     const(char)* xdgRuntimeDirectory(xdgHandle *handle);
25 }
26 
27 version(XDGBasedirMainTest)
28 {
29     import std.stdio;
30     import std.process : environment;
31     import std.c.string : strlen;
32     
33     @system pure inout(char)[] fromCString(inout(char)* cString) {
34         return cString ? cString[0..strlen(cString)] : null;
35     }
36     
37     void printDirectories(string message, const(char*)* directories)
38     {
39         writef("%s: ", message);
40         for (; *directories != null; directories++) {
41             writef("%s;", (*directories)[0..strlen(*directories)]);
42         }
43         writeln();
44     }
45     
46     int main(string[] args) 
47     {
48         xdgHandle handle;
49         if (!xdgInitHandle(&handle)) {
50             stderr.writeln("Could not initialize xdgHandle");
51             return -1;
52         }
53         scope(exit) xdgWipeHandle(&handle);
54         
55         writeln("xdgDataHome: ", xdgDataHome(&handle).fromCString);
56         writeln("xdgConfigHome: ", xdgConfigHome(&handle).fromCString);
57         
58         printDirectories("Data dirs", xdgDataDirectories(&handle));
59         printDirectories("Searchable data dirs", xdgSearchableDataDirectories(&handle));
60         
61         printDirectories("Config dirs", xdgConfigDirectories(&handle));
62         printDirectories("Searchable config dirs", xdgSearchableConfigDirectories(&handle));
63         
64         writeln("xdgCacheHome: ", xdgCacheHome(&handle).fromCString);
65         writeln("xdgRuntimeDirectory: ", xdgRuntimeDirectory(&handle).fromCString);
66         
67         environment["XDG_CONFIG_HOME"] = "config directory updated via environment";
68         if (!xdgUpdateData(&handle)) {
69             stderr.writeln("Could not update handle");
70         }
71         writeln("xdgConfigHome after update: ", xdgConfigHome(&handle).fromCString);
72         
73         return 0;
74     }
75 }