aboutsummaryrefslogtreecommitdiff
path: root/tools/Crupest.V2ray/Crupest.V2ray/FileUtility.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tools/Crupest.V2ray/Crupest.V2ray/FileUtility.cs')
-rw-r--r--tools/Crupest.V2ray/Crupest.V2ray/FileUtility.cs94
1 files changed, 94 insertions, 0 deletions
diff --git a/tools/Crupest.V2ray/Crupest.V2ray/FileUtility.cs b/tools/Crupest.V2ray/Crupest.V2ray/FileUtility.cs
new file mode 100644
index 0000000..08de673
--- /dev/null
+++ b/tools/Crupest.V2ray/Crupest.V2ray/FileUtility.cs
@@ -0,0 +1,94 @@
+using System.Text.Json;
+using System.Text.RegularExpressions;
+
+namespace Crupest.V2ray;
+
+public static partial class FileUtility
+{
+ public static List<string> ReadList(string str)
+ {
+ return str.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries).ToList();
+ }
+
+ public static Dictionary<string, string> ReadDictionary(string str, bool keyToLower = true)
+ {
+ var lines = str.Split("\n", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
+ var result = new Dictionary<string, string>();
+ for (int lineNumber = 0; lineNumber < lines.Length; lineNumber++)
+ {
+ var line = lines[lineNumber];
+ if (!line.Contains('='))
+ {
+ throw new FormatException($"Line {lineNumber + 1} does not contain a '='.");
+ }
+ var equalIndex = line.IndexOf('=');
+ var key = line[..equalIndex].Trim();
+ if (keyToLower) key = key.ToLower();
+ var value = line[(equalIndex + 1)..].Trim();
+ result[key] = value;
+ }
+ return result;
+ }
+
+ public static List<string> ReadListFile(string path, bool required = true)
+ {
+ if (File.Exists(path))
+ {
+ return ReadList(File.ReadAllText(path));
+ }
+ else
+ {
+ if (required)
+ {
+ throw new FileNotFoundException($"File {path} is required but it does not exist.");
+ }
+ return new();
+ }
+ }
+
+ public static Dictionary<string, string> ReadDictionaryFile(string path, bool required = true, bool keyToLower = true)
+ {
+ if (File.Exists(path))
+ {
+ return ReadDictionary(File.ReadAllText(path), keyToLower);
+ }
+ else
+ {
+ if (required)
+ {
+ throw new FileNotFoundException($"File {path} is required but it does not exist.");
+ }
+ return new();
+ }
+ }
+
+ private static Regex TemplateValuePattern { get; } = CreateTemplateValuePattern();
+
+ [GeneratedRegex(@"\$\{\s*([_a-zA-Z][_a-zA-Z0-9]*)\s*\}")]
+ private static partial Regex CreateTemplateValuePattern();
+
+ public static string TextFromTemplate(string template, Dictionary<string, string> dict)
+ {
+ return TemplateValuePattern.Replace(template, (match) =>
+ {
+ var key = match.Groups[1].Value;
+ if (dict.ContainsKey(key))
+ {
+ return dict[key];
+ }
+ return match.Value;
+ });
+ }
+
+ public static string JsonFormat(string json)
+ {
+ var options = new JsonSerializerOptions
+ {
+ WriteIndented = true,
+ AllowTrailingCommas = true,
+ ReadCommentHandling = JsonCommentHandling.Skip
+ };
+
+ return JsonSerializer.Serialize(JsonSerializer.Deserialize<JsonDocument>(json, options), options);
+ }
+}