1 /**
2 Copyright: Copyright (c) 2019, Joakim Brännström. All rights reserved.
3 License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
4 Author: Joakim Brännström (joakim.brannstrom@gmx.com)
5 */
6 module dsnapshot.from;
7 /** Local imports everywhere.
8 
9 Example:
10 ---
11 std_.foo fun(std_.string.Path p)
12 ---
13 */
14 
15 enum from = FromImpl!null();
16 enum std_ = from.std;
17 
18 private:
19 
20 template isModuleImport(string import_) {
21     enum isModuleImport = __traits(compiles, { mixin("import ", import_, ";"); });
22 }
23 
24 template isSymbolInModule(string module_, string symbol) {
25     static if (isModuleImport!module_) {
26         enum import_ = module_ ~ ":" ~ symbol;
27         enum isSymbolInModule = __traits(compiles, {
28                 mixin("import ", import_, ";");
29             });
30     } else {
31         enum isSymbolInModule = false;
32     }
33 }
34 
35 template FailedSymbol(string symbol, string module_) {
36     auto FailedSymbol(Args...)(auto ref Args args) {
37         static assert(0, "Symbol \"" ~ symbol ~ "\" not found in " ~ module_);
38     }
39 }
40 
41 struct FromImpl(string module_) {
42     template opDispatch(string symbol) {
43         static if (isSymbolInModule!(module_, symbol)) {
44             mixin("import ", module_, "; alias opDispatch = ", symbol, ";");
45         } else {
46             static if (module_.length == 0) {
47                 enum opDispatch = FromImpl!(symbol)();
48             } else {
49                 enum import_ = module_ ~ "." ~ symbol;
50                 static if (isModuleImport!import_) {
51                     enum opDispatch = FromImpl!(import_)();
52                 } else {
53                     alias opDispatch = FailedSymbol!(symbol, module_);
54                 }
55             }
56         }
57     }
58 }