1 /++
2 $(H2 Scriptlike $(SCRIPTLIKE_VERSION))
3 
4 Wrappers for $(MODULE_STD_PATH) that add support for Scriptlike's
5 $(API_PATH_EXTR Path) and command echoing features.
6 
7 Copyright: Copyright (C) 2014-2015 Nick Sabalausky
8 License:   zlib/libpng
9 Authors:   Nick Sabalausky
10 +/
11 module scriptlike.path.wrappers;
12 
13 import std.algorithm;
14 import std.conv;
15 import std.datetime;
16 import std.file;
17 import std.process;
18 import std.range;
19 import std.stdio;
20 import std.string;
21 import std.traits;
22 import std.typecons;
23 import std.typetuple;
24 
25 static import std.path;
26 public import std.path : dirSeparator, pathSeparator, isDirSeparator,
27 	CaseSensitive, osDefaultCaseSensitivity, buildPath, buildNormalizedPath;
28 
29 import scriptlike.path.extras;
30 
31 /// Like $(FULL_STD_PATH baseName), but operates on Path.
32 Path baseName(Path path)
33 	@trusted pure
34 {
35 	return Path( std.path.baseName(path.toRawString()) );
36 }
37 
38 ///ditto
39 Path baseName(CaseSensitive cs = CaseSensitive.osDefault)
40 	(Path path, in string suffix)
41 	@safe pure
42 {
43 	return Path( std.path.baseName!cs(path.toRawString(), suffix) );
44 }
45 /// Like $(FULL_STD_PATH dirName), but operates on Path.
46 Path dirName(Path path)
47 {
48 	return Path( std.path.dirName(path.toRawString()) );
49 }
50 
51 /// Like $(FULL_STD_PATH rootName), but operates on Path.
52 Path rootName(Path path) @safe pure nothrow
53 {
54 	return Path( std.path.rootName(path.toRawString()) );
55 }
56 
57 /// Like $(FULL_STD_PATH driveName), but operates on Path.
58 Path driveName(Path path) @safe pure nothrow
59 {
60 	return Path( std.path.driveName(path.toRawString()) );
61 }
62 
63 /// Like $(FULL_STD_PATH stripDrive), but operates on Path.
64 Path stripDrive(Path path) @safe pure nothrow
65 {
66 	return Path( std.path.stripDrive(path.toRawString()) );
67 }
68 
69 /// Like $(FULL_STD_PATH extension), but takes a Path and returns an Ext.
70 Ext extension(in Path path) @safe pure nothrow
71 {
72 	return Ext( std.path.extension(path.toRawString()) );
73 }
74 
75 /// Like $(FULL_STD_PATH stripExtension), but operates on Path.
76 Path stripExtension(Path path) @safe pure nothrow
77 {
78 	return Path( std.path.stripExtension(path.toRawString()) );
79 }
80 
81 /// Like $(FULL_STD_PATH setExtension), but operates on Path.
82 Path setExtension(Path path, string ext)
83 	@trusted pure nothrow
84 {
85 	return Path( std.path.setExtension(path.toRawString(), ext) );
86 }
87 
88 ///ditto
89 Path setExtension(Path path, Ext ext)
90 	@trusted pure nothrow
91 {
92 	return path.setExtension(ext.toString());
93 }
94 
95 /// Like $(FULL_STD_PATH defaultExtension), but operates on Path and optionally Ext.
96 Path defaultExtension(Path path, in string ext)
97 	@trusted pure
98 {
99 	return Path( std.path.defaultExtension(path.toRawString(), ext) );
100 }
101 
102 ///ditto
103 Path defaultExtension(Path path, Ext ext)
104 	@trusted pure
105 {
106 	return path.defaultExtension(ext.toString());
107 }
108 
109 /// Like $(FULL_STD_PATH pathSplitter). Note this returns a range of strings,
110 /// not a range of Path.
111 auto pathSplitter(Path path) @safe pure nothrow
112 {
113 	return std.path.pathSplitter(path.toRawString());
114 }
115 
116 /// Like $(FULL_STD_PATH isRooted), but operates on Path.
117 bool isRooted(in Path path) @safe pure nothrow
118 {
119 	return std.path.isRooted(path.toRawString());
120 }
121 
122 /// Like $(FULL_STD_PATH isAbsolute), but operates on Path.
123 bool isAbsolute(in Path path) @safe pure nothrow
124 {
125 	return std.path.isAbsolute(path.toRawString());
126 }
127 
128 /// Like $(FULL_STD_PATH absolutePath), but operates on Path.
129 Path absolutePath(Path path, lazy string base = getcwd())
130 	@safe pure
131 {
132 	return Path( std.path.absolutePath(path.toRawString(), base) );
133 }
134 
135 ///ditto
136 Path absolutePath(Path path, Path base)
137 	@safe pure
138 {
139 	return Path( std.path.absolutePath(path.toRawString(), base.toRawString().to!string()) );
140 }
141 
142 /// Like $(FULL_STD_PATH relativePath), but operates on Path.
143 Path relativePath(CaseSensitive cs = CaseSensitive.osDefault)
144 	(Path path, lazy string base = getcwd())
145 {
146 	return Path( std.path.relativePath!cs(path.toRawString(), base) );
147 }
148 
149 ///ditto
150 Path relativePath(CaseSensitive cs = CaseSensitive.osDefault)
151 	(Path path, Path base)
152 {
153 	return Path( std.path.relativePath!cs(path.toRawString(), base.toRawString().to!string()) );
154 }
155 
156 /// Like $(FULL_STD_PATH filenameCmp), but operates on Path.
157 int filenameCmp(CaseSensitive cs = CaseSensitive.osDefault)
158 	(Path path, Path filename2)
159 	@safe pure
160 {
161 	return std.path.filenameCmp(path.toRawString(), filename2.toRawString());
162 }
163 
164 ///ditto
165 int filenameCmp(CaseSensitive cs = CaseSensitive.osDefault)
166 	(Path path, string filename2)
167 	@safe pure
168 {
169 	return std.path.filenameCmp(path.toRawString(), filename2);
170 }
171 
172 ///ditto
173 int filenameCmp(CaseSensitive cs = CaseSensitive.osDefault)
174 	(string path, Path filename2)
175 	@safe pure
176 {
177 	return std.path.filenameCmp(path, filename2.toRawString());
178 }
179 
180 /// Like $(FULL_STD_PATH globMatch), but operates on Path.
181 bool globMatch(CaseSensitive cs = CaseSensitive.osDefault)
182 	(Path path, string pattern)
183 	@safe pure nothrow
184 {
185 	return std.path.globMatch!cs(path.toRawString(), pattern);
186 }
187 
188 /// Like $(FULL_STD_PATH isValidFilename), but operates on Path.
189 bool isValidFilename(in Path path) @safe pure nothrow
190 {
191 	return std.path.isValidFilename(path.toRawString());
192 }
193 
194 /// Like $(FULL_STD_PATH isValidPath), but operates on Path.
195 bool isValidPath(in Path path) @safe pure nothrow
196 {
197 	return std.path.isValidPath(path.toRawString());
198 }
199 
200 /// Like $(FULL_STD_PATH expandTilde), but operates on Path.
201 Path expandTilde(Path path)
202 {
203 	return Path( std.path.expandTilde(path.toRawString()) );
204 }