-
Notifications
You must be signed in to change notification settings - Fork 96
/
URLBuilder.cs
116 lines (92 loc) · 4 KB
/
URLBuilder.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using System;
using System.IO;
using System.Linq;
using System.Reflection;
namespace TestUtils
{
public static class UrlBuilder
{
private static FieldInfo UrlDir__field__name;
private static FieldInfo UrlDir__field__root;
private static FieldInfo UrlDir__field__parent;
private static FieldInfo UrlFile__field__name;
private static FieldInfo UrlFile__field__fileType;
private static FieldInfo UrlFile__field__fileExtension;
static UrlBuilder()
{
FieldInfo[] UrlDirFields = typeof(UrlDir).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo[] UrlDirFields__string = UrlDirFields.Where(field => field.FieldType == typeof(string)).ToArray();
FieldInfo[] UrlDirFields__UrlDir = UrlDirFields.Where(field => field.FieldType == typeof(UrlDir)).ToArray();
UrlDir__field__name = UrlDirFields__string[0];
UrlDir__field__root = UrlDirFields__UrlDir[0];
UrlDir__field__parent = UrlDirFields__UrlDir[1];
FieldInfo[] UrlFileFields = typeof(UrlDir.UrlFile).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
FieldInfo[] UrlFileFields__string = UrlFileFields.Where(field => field.FieldType == typeof(string)).ToArray();
FieldInfo[] UrlFileFields__FileType = UrlFileFields.Where(field => field.FieldType == typeof(UrlDir.FileType)).ToArray();
UrlFile__field__name = UrlFileFields__string[0];
UrlFile__field__fileExtension = UrlFileFields__string[2];
UrlFile__field__fileType = UrlFileFields__FileType[0];
}
public static UrlDir CreateRoot()
{
return new UrlDir(new UrlDir.ConfigDirectory[0], new UrlDir.ConfigFileType[0]);
}
public static UrlDir CreateDir(string url, UrlDir parent = null)
{
if (parent == null) parent = CreateRoot();
UrlDir current = parent;
foreach(string name in url.Split('/'))
{
UrlDir dir = CreateRoot();
UrlDir__field__name.SetValue(dir, name);
UrlDir__field__root.SetValue(dir, current.root);
UrlDir__field__parent.SetValue(dir, current);
current.children.Add(dir);
current = dir;
}
return current;
}
public static UrlDir.UrlFile CreateFile(string path, UrlDir parent = null)
{
int sepIndex = path.LastIndexOf('/');
string name = path;
if (sepIndex != -1)
{
parent = CreateDir(path.Substring(0, sepIndex), parent);
name = path.Substring(sepIndex + 1);
}
else if (parent == null)
{
parent = CreateRoot();
}
bool cfg = false;
string newName = name;
if (Path.GetExtension(name) == ".cfg")
{
cfg = true;
newName = name + ".not_cfg";
}
UrlDir.UrlFile file = new UrlDir.UrlFile(parent, new FileInfo(newName));
if (cfg)
{
UrlFile__field__name.SetValue(file, Path.GetFileNameWithoutExtension(name));
UrlFile__field__fileExtension.SetValue(file, "cfg");
UrlFile__field__fileType.SetValue(file, UrlDir.FileType.Config);
}
parent.files.Add(file);
return file;
}
public static UrlDir.UrlConfig CreateConfig(ConfigNode node, UrlDir.UrlFile parent)
{
UrlDir.UrlConfig config = new UrlDir.UrlConfig(parent, node);
parent.configs.Add(config);
return config;
}
public static UrlDir.UrlConfig CreateConfig(string url, ConfigNode node, UrlDir parent = null)
{
if (Path.GetExtension(url) != ".cfg") url += ".cfg";
UrlDir.UrlFile file = CreateFile(url, parent);
return CreateConfig(node, file);
}
}
}