1 /**
2 Copyright: Copyright (c) 2020, 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 my.from_;
7 
8 /** Local imports everywhere.
9 
10 Example:
11 ---
12 std_.foo fun(std_.string.Path p)
13 ---
14 */
15 
16 enum from = FromImpl!null();
17 enum std_ = from.std;
18 
19 private:
20 
21 template isModuleImport(string import_) {
22     enum isModuleImport = __traits(compiles, { mixin("import ", import_, ";"); });
23 }
24 
25 template isSymbolInModule(string module_, string symbol) {
26     static if (isModuleImport!module_) {
27         enum import_ = module_ ~ ":" ~ symbol;
28         enum isSymbolInModule = __traits(compiles, {
29                 mixin("import ", import_, ";");
30             });
31     } else {
32         enum isSymbolInModule = false;
33     }
34 }
35 
36 template FailedSymbol(string symbol, string module_) {
37     auto FailedSymbol(Args...)(auto ref Args args) {
38         static assert(0, "Symbol \"" ~ symbol ~ "\" not found in " ~ module_);
39     }
40 }
41 
42 struct FromImpl(string module_) {
43     template opDispatch(string symbol) {
44         static if (isSymbolInModule!(module_, symbol)) {
45             mixin("import ", module_, "; alias opDispatch = ", symbol, ";");
46         } else {
47             static if (module_.length == 0) {
48                 enum opDispatch = FromImpl!(symbol)();
49             } else {
50                 enum import_ = module_ ~ "." ~ symbol;
51                 static if (isModuleImport!import_) {
52                     enum opDispatch = FromImpl!(import_)();
53                 } else {
54                     alias opDispatch = FailedSymbol!(symbol, module_);
55                 }
56             }
57         }
58     }
59 }