submodule对gitea不管用,所以直接拉了一份拉格兰
This commit is contained in:
61
Lagrange.Core/Lagrange.Core.Test/Utility/ProtoGen.cs
Normal file
61
Lagrange.Core/Lagrange.Core.Test/Utility/ProtoGen.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using ProtoBuf;
|
||||
|
||||
namespace Lagrange.Core.Test.Utility;
|
||||
|
||||
internal static class ProtoGen
|
||||
{
|
||||
public static void GenerateProtoFiles()
|
||||
{
|
||||
var assembly = typeof(Lagrange.Core.Utility.ServiceInjector).Assembly;
|
||||
var types = assembly.GetTypes();
|
||||
var sb = new StringBuilder();
|
||||
|
||||
sb.AppendLine("syntax = \"proto3\";");
|
||||
sb.AppendLine();
|
||||
sb.AppendLine("package Lagrange.Core;");
|
||||
|
||||
foreach (var type in types)
|
||||
{
|
||||
if (type.Namespace?.StartsWith("Lagrange.Core.Internal.Packets") != true) continue;
|
||||
|
||||
sb.AppendLine($"message {type.Name} {{");
|
||||
var properties = type.GetProperties();
|
||||
foreach (var property in properties)
|
||||
{
|
||||
string typeString = ParseType(property.PropertyType);
|
||||
sb.AppendLine($" {GetLastToken(typeString, '.')} {property.Name} = {property.GetCustomAttribute<ProtoMemberAttribute>()?.Tag};");
|
||||
}
|
||||
sb.AppendLine("}");
|
||||
sb.AppendLine();
|
||||
}
|
||||
|
||||
string proto = sb.ToString();
|
||||
|
||||
File.WriteAllText("packets.proto", proto);
|
||||
}
|
||||
|
||||
private static string ParseType(Type type)
|
||||
{
|
||||
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
|
||||
{
|
||||
return $"repeated {ParseType(type.GetGenericArguments()[0])}";
|
||||
}
|
||||
|
||||
return type.ToString() switch
|
||||
{
|
||||
"System.UInt64" => "varint",
|
||||
"System.UInt32" => "varint",
|
||||
"System.UInt16" => "varint",
|
||||
"System.Int64" => "varint",
|
||||
"System.Int32" => "varint",
|
||||
"System.String" => "string",
|
||||
"System.Boolean" => "bool",
|
||||
"System.Byte[]" => "bytes",
|
||||
_ => type.ToString()
|
||||
};
|
||||
}
|
||||
|
||||
private static string GetLastToken(string str, char separator) => str.Split(separator)[^1];
|
||||
}
|
||||
Reference in New Issue
Block a user