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 }