walk function
Implementation
bool walk(String srcDir, String distDir,String tag) {
if(srcDir.endsWith("/")) srcDir=srcDir.substring(0, srcDir.length-1);
if(distDir.endsWith("/")) distDir=distDir.substring(0, distDir.length-1);
var src = Directory(srcDir);
var list = src.listSync(recursive: true);
String indexFile = "";
if(list.isEmpty) return false;
if(!Directory(distDir).existsSync()){
Directory(distDir).createSync(recursive: true);
}
print("开始生成对应的JsonSerializable模板");
File file;
list.forEach((f) {
if (FileSystemEntity.isFileSync(f.path)) {
file = File(f.path);
var paths = path.basename(f.path).split(".");
String name = paths.first;
if(paths.last.toLowerCase()!= "json"||name.startsWith("_")) return ;
if(name.startsWith("_")) return;
//下面生成模板
var map = json.decode(file.readAsStringSync());
//为了避免重复导入相同的包,我们用Set来保存生成的import语句。
var set = new Set<String>();
StringBuffer attrs= new StringBuffer();
StringBuffer initAttrs = new StringBuffer();
(map as Map<String, dynamic>).forEach((key, v) {
if(key.startsWith("_")) return ;
if(key.startsWith("@")){
if(key.startsWith("@import")){
set.add(key.substring(1)+" '$v'");
return;
}
attrs.write(key);
attrs.write(" ");
attrs.write(v);
attrs.writeln(";");
//设置对应的属性
initAttrs.write(" this."+key+",\r\n");
}else {
attrs.write(getType(v, set, name, tag));
attrs.write(" ");
attrs.write(key);
attrs.writeln(";");
initAttrs.write(" this."+key+",\r\n");
}
attrs.write(" ");
});
String className=name[0].toUpperCase()+name.substring(1);
//替换文本
var dist = format(tpl,[name,className,className,initAttrs.toString(),attrs.toString(),
className,className,className]);
var _import = set.join(";\r\n");
_import += _import.isEmpty?"":";";
dist = dist.replaceFirst("%t",_import );
//将生成的模板输出
var p = f.path.replaceFirst(srcDir, distDir).replaceFirst(".json", ".dart");
//写入文件中
File(p)..createSync(recursive: true)..writeAsStringSync(dist);
var relative = p.replaceFirst(distDir+path.separator, "");
indexFile += "export '$relative' ; \n";
}
});
if(indexFile.isNotEmpty) {
File(path.join(distDir, "index.dart")).writeAsStringSync(indexFile);
}
print("JsonSerializable模板生成完毕");
return indexFile.isNotEmpty;
}