1 // Copyright © 2017 Rémi Thebault 2 /++ 3 + Wayland scanner for D. 4 + Scan wayland XML protocol and generates client or server code for that protocol. 5 +/ 6 module wayland.scanner; 7 8 import wayland.scanner.common; 9 import wayland.scanner.client; 10 import wayland.scanner.server; 11 12 import arsd.dom; 13 14 import std.array; 15 import std.getopt; 16 import std.stdio; 17 18 enum scannerVersion = "v0.1.0"; 19 enum usageIntro = "wayland:scanner-"~scannerVersion~"\n"~ 20 " A Wayland protocol scanner and D code generator.\n\n"; 21 enum bindingsCopyright = "Copyright © 2017 Rémi Thebault"; 22 23 24 int main(string[] args) 25 { 26 auto opt = new Options; 27 opt.cmdLine = args.join(" "); 28 auto optHandler = getopt ( 29 args, 30 "code|c", "generated code: client|server [client]", &opt.code, 31 "input|i", "input file [stdin]", &opt.inFile, 32 "output|o", "output file [stdout]", &opt.outFile, 33 "module|m", "D module name (required)", &opt.moduleName, 34 ); 35 36 if (optHandler.helpWanted) 37 { 38 defaultGetoptFormatter ( 39 stdout.lockingTextWriter, 40 usageIntro ~ "Options:", 41 optHandler.options 42 ); 43 return 0; 44 } 45 46 if (opt.moduleName.empty) 47 { 48 defaultGetoptFormatter ( 49 stderr.lockingTextWriter, 50 usageIntro ~ 51 "Error: D module name must be supplied with '--module' or '-m'\n\n" ~ 52 "Options:", 53 optHandler.options 54 ); 55 return 1; 56 } 57 58 try 59 { 60 File input = (opt.inFile.empty) ? stdin : File(opt.inFile, "r"); 61 File output = (opt.outFile.empty) ? stdout : File(opt.outFile, "w"); 62 63 string xmlStr; 64 foreach (string l; lines(input)) 65 { 66 xmlStr ~= l; 67 } 68 auto xmlDoc = new Document; 69 xmlDoc.parse(xmlStr, true, true); 70 71 if (opt.code == GenCode.client) 72 fact = new ClientFactory; 73 else 74 fact = new ServerFactory; 75 76 auto p = fact.makeProtocol(xmlDoc.root); 77 p.writeCode(new SourceFile(output), opt); 78 } 79 catch(Exception ex) 80 { 81 stderr.writeln("Error: "~ex.msg); 82 return 1; 83 } 84 85 return 0; 86 } 87 88 enum GenCode 89 { 90 client, 91 server, 92 } 93 94 class Options 95 { 96 string cmdLine; 97 98 string inFile; 99 string outFile; 100 string moduleName; 101 102 GenCode code; 103 }