1 /++
2 BindBC utils
3 +/
4 module sily.bindbc;
5 
6 import std.string: toStringz;
7 import std.traits;
8 
9 import bindbc.loader;
10 
11 import sily.logger;
12 
13 /**
14 Loads generic bindbc library.
15 Example:
16 ---
17 loadBincBCLib!(bindbc.opengl, GLSupport, loadOpenGL, glSupport, "OpenGL");
18 loadBincBCLib!(bindbc.sfml, SFMLSupport, loadSFMLWindow, sfmlSupport, "SFML Window");
19 ---
20 */
21 bool loadBincBCLib
22     (alias moduleName, alias support, alias loader, alias supportSuccess, string name,
23      int L = __LINE__, string F = __FILE__)(Log p_logger = Log()) {
24     const string supn = __traits(identifier, support);
25     const string lodn = __traits(identifier, loader);
26     const string sucn = __traits(identifier, supportSuccess);
27     const string modn = __traits(identifier, moduleName);
28     import sily.logger: info, error;
29     mixin(
30     `import bindbc.` ~ modn ~ `;` ~
31     supn ~ ` ret = ` ~ lodn ~`();
32     if (ret != ` ~ sucn ~ `) {
33         if (ret == ` ~ supn ~ `.noLibrary) {
34             p_logger.error!(L, F)("Failed to load ` ~ name ~ ` library");
35         } else 
36         if (ret == ` ~ supn ~ `.badLibrary) {
37             p_logger.error!(L, F)("Failed to load one or more ` ~ name ~ `  symbols");
38         } else {
39             p_logger.error!(L, F)("Unknown error. Failed to load ` ~ name ~ ` library");
40         }
41         return false;
42     }
43     p_logger.info!(L, F)("` ~ name ~ ` library successfully loaded");
44     `);
45     return true;
46 }
47 
48 /++
49 Sets search path for bindbc dll libraries.
50 Windows only, has no effect on linux
51 +/
52 void setBincBCLibPath(string path) {
53     version(Windows) setCustomLoaderSearchPath(path.toStringz);
54 }
55 
56 /++
57 Resets search path for bindbc dll libraries.
58 Windows only, has no effect on linux
59 +/
60 void resetBincBCLibPath() {
61     version(Windows) setCustomLoaderSearchPath(null);
62 }