walk function

bool walk(
  1. String srcDir,
  2. String distDir,
  3. String tag
)

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;
}