TomlUtil.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace FastGithub.DomainResolve
  8. {
  9. /// <summary>
  10. /// doml配置工具
  11. /// </summary>
  12. static class TomlUtil
  13. {
  14. /// <summary>
  15. /// 设置监听地址
  16. /// </summary>
  17. /// <param name="tomlPath"></param>
  18. /// <param name="endpoint"></param>
  19. /// <returns></returns>
  20. public static Task SetListensAsync(string tomlPath, IPEndPoint endpoint, CancellationToken cancellationToken = default)
  21. {
  22. return SetAsync(tomlPath, "listen_addresses", $"['{endpoint}']");
  23. }
  24. /// <summary>
  25. /// 设置指定键的值
  26. /// </summary>
  27. /// <param name="tomlPath"></param>
  28. /// <param name="key"></param>
  29. /// <param name="value"></param>
  30. public static async Task SetAsync(string tomlPath, string key, object? value, CancellationToken cancellationToken = default)
  31. {
  32. var lines = await File.ReadAllLinesAsync(tomlPath, cancellationToken);
  33. var toml = Set(lines, key, value);
  34. await File.WriteAllTextAsync(tomlPath, toml, cancellationToken);
  35. }
  36. /// <summary>
  37. /// 设置值
  38. /// </summary>
  39. /// <param name="lines"></param>
  40. /// <param name="key"></param>
  41. /// <param name="value"></param>
  42. /// <returns></returns>
  43. private static string Set(string[] lines, string key, object? value)
  44. {
  45. var updated = false;
  46. var builder = new StringBuilder();
  47. foreach (var line in lines)
  48. {
  49. var span = line.AsSpan();
  50. if (span.IsEmpty || span[0] == '#')
  51. {
  52. builder.AppendLine(line);
  53. continue;
  54. }
  55. var index = span.IndexOf('=');
  56. if (index <= 0 || span.Slice(0, index).Trim().SequenceEqual(key) == false)
  57. {
  58. builder.AppendLine(line);
  59. continue;
  60. }
  61. builder.Append(key).Append(" = ").AppendLine(value?.ToString());
  62. updated = true;
  63. }
  64. if (updated == false)
  65. {
  66. builder.Append(key).Append(" = ").AppendLine(value?.ToString());
  67. }
  68. return builder.ToString();
  69. }
  70. }
  71. }