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 }